描述

一个长度为n的记账单,+表示存¥1,-表示取¥1。 
现在发现记账单有问题。 
一开始本来已经存了¥p,并且知道最后账户上还有¥q。 
你要把记账单修改正确,使得 
1:账户永远不会出现负数; 
2:最后账户上还有¥q。 
你有2种操作: 
1:对某一位取反,耗时x; 
2:把最后一位移到第一位,耗时y。

输入格式

The first line contains 5 integers n, p, q, x and y (1 n 1000000, 0 p;q 1000000, 1 x;y 1000), 
separated by single spaces and denoting respectively: the number of transactions done by Byteasar, initial 
and final account balance and the number of seconds needed to perform a single turn (change of sign) and 
move of transaction to the beginning. The second line contains a sequence of n signs (each a plus or a minus), 
with no spaces in-between.

1 ≤ n ≤ 1000000, 0 ≤ p ,q ≤ 1000000, 1 ≤x,y ≤ 1000)

输出格式

修改消耗的时间

测试样例1

输入

9 2 3 2 1 
---++++++

输出

3

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

单调队列+贪心~

因为有一个把最后一位移到第一位的操作,所以用类似于破环为链的方法,重复两次数组,计算前缀和。

维护单调队列,计算每个位置的最小值,记录到数组中,最后枚举移位次数,计算该移位次数下的最小值,更新ans值。

(数组大得好夸张,吓得我都不敢交了……)

(在BZOJ上交要把输出改成lld,否则会PE~)

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define ll long long  int n,p,q,x,y,que[1000100<<1],head,tail,num[1000100<<1];
ll tot,ans,cal[1000100],fi[1000100],now;
char s[1000100];  ll abs(ll u)
{  return u>0 ? u:-u;
}  int main()
{  scanf("%d%d%d%d%d",&n,&p,&q,&x,&y);  scanf("%s",s+1);head=1;tail=0;  for(int i=n*2;i>n;i--) num[i]=num[i+1]+(s[i-n]=='+' ? 1:-1);tot=num[n+1];  for(int i=n;i;i--) num[i]=num[i+1]+(s[i]=='+' ? 1:-1);  for(int i=n*2;i;i--)  {  while(head<=tail && num[i]>num[que[tail]]) tail--;  que[++tail]=i;  while(head<=tail && que[head]-i>n) head++;  if(i<=n) fi[i]=num[i]-num[que[head]];  }  ans=0x7f7f7f7f7f7f7f7fll;  cal[1]=1;  tot=q-p-tot;tot/=2;  for(int i=2;i<=n;i++) cal[i]=n-i+2ll;  for(int i=0;i<n;i++)  {  now=i*y+abs(tot)*x;  fi[cal[i+1]]+=p+max(tot,0ll)*2ll;  if(fi[cal[i+1]]<0) now+=((1-fi[cal[i+1]])/2ll)*2*x;  ans=min(ans,now);  }  printf("%I64d\n",ans);  return 0;
}  

Tyvj P3572 BZOJ 1122 账本BBB相关推荐

  1. BZOJ 1122 [POI2008]账本BBB

    Description 一个长度为n的记账单,+表示存¥1,-表示取¥1.现在发现记账单有问题.一开始本来已经存了¥p,并且知道最后账户上还有¥q.你要把记账单修改正确,使得 1:账户永远不会出现负数 ...

  2. rust放置木箱转向_[易学易懂系列|rustlang语言|零基础|快速入门|(17)|装箱crates]...

    [易学易懂系列|rustlang语言|零基础|快速入门|(17)|装箱crates] 实用知识 装箱crates 我们今天来讲讲装箱技术crates. 什么是crates? 英语翻译是: 英 [kre ...

  3. 省选之前的未完成的计划(截至到省选)

    PLAN OF THE COMING HEOI good problems: -bzoj4823:[Cqoi2017]老C的方块 [*] -bzoj3171:[Tjoi2013]循环格 [*] -bz ...

  4. 洛谷 P3380 bzoj3196 Tyvj1730 【模板】二逼平衡树(树套树)

    [模板]二逼平衡树(树套树) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 查询k在区间内的排名 查询区间内排名为k的值 修改某一位值上的数值 查询k在 ...

  5. java 微信时间戳转换工具,微信小程序时间戳的转换及调用

    [Filter 不登陆无法访问]web项目中写一个过滤器实现用户不登陆,直接给链接,无法进入页面的功能 在web项目中写一个过滤器实现用户不登陆,直接给链接,无法进入页面,而重定向到登陆界面的功能. ...

  6. BZOJ 3224: Tyvj 1728 普通平衡树【Treap】

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Description 您需要写一种数据结构(可参考题目标题),来维护一些数 ...

  7. BZOJ #3064. Tyvj 1518 CPU监控(线段树,历史最值)

    BZOJ #3064. Tyvj 1518 CPU监控(线段树,历史最值) Solution 我们考虑用线段树维护此题. 先不考虑历史最值. 大概需要维护一种特殊的懒标记(x,y)(x,y)(x,y) ...

  8. BZOJ 3224: Tyvj 1728 普通平衡树 treap

    3224: Tyvj 1728 普通平衡树 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...

  9. BZOJ 3223: Tyvj 1729 文艺平衡树(splay)

    速度居然进前十了...第八... splay, 区间翻转,用一个类似线段树的lazy标记表示是否翻转 ------------------------------------------------- ...

最新文章

  1. 如何重命名本地Git分支?
  2. python如何读写文件-Python之写入文件(1)
  3. CSS3 background-image背景图片相关介绍
  4. 用Python求出:1到某个数的奇数序列里一共出现了多少个3
  5. MongoDB最简单的入门教程之一 环境搭建
  6. python缩进教学_Python缩进和选择学习
  7. const 修饰函数参数,返回值,函数体,保护数据
  8. android 检查 write_external_storage,android – 如何知道何时需要WRITE_EXTERNAL_STORAGE
  9. PHP消息队列实现及应用
  10. Mysql索引之-cardinality
  11. Linux Rsync服务详解(二)——Rsync服务实战
  12. 数据-第13课-链表回顾
  13. 「镁客·请讲」亮亮视野吴斐:行业应用体现AR硬件的价值本质
  14. 传输层协议(7):滑动窗口(1)
  15. 粪斗吧 ! 骚年 !
  16. MSC-VO: 基于曼哈顿和结构约束的视觉里程计(CVPR 2021)
  17. goto解密PHP源码解密程序源码下载
  18. C# DLL HRESULT:0x8007000B
  19. 屏的接口类型种类以及接口定义分析
  20. 百年金融市场「暴跌」启示录

热门文章

  1. 第八周项目4个人所得税计算
  2. c++ ----to_string、stoi()、atoi()
  3. mysql中的utf8mb4、utf8mb4_unicode_ci、utf8mb4_general_ci
  4. 分享几个免费下载各类电子书的网站
  5. word转换pdf的python代码_python word转pdf代码实例
  6. 基于Android开发的医疗系统项目开发实战案例
  7. 供水管网监测系统解决方案
  8. LINUX学习------Linux自动化运维——Docker容器
  9. 视频图像数据处理三:将yuv420视频图像转换为灰度图像
  10. Linux设置网卡IP地址-ifconfig和ip命令