[bzoj1122][POI2008]账本BBB
1122: [POI2008]账本BBB
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 402 Solved: 202
[Submit][Status][Discuss]
Description
一个长度为n的记账单,+表示存¥1,-表示取¥1。现在发现记账单有问题。一开始本来已经存了¥p,并且知道最后账户上还有¥q。你要把记账单修改正确,使得 1:账户永远不会出现负数; 2:最后账户上还有¥q。你有2种操作: 1:对某一位取反,耗时x; 2:把最后一位移到第一位,耗时y。
Input
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)
Output
修改消耗的时间
Sample Input
---++++++
Sample Output
HINT
Source
老师的惊天模拟赛#2
TAT还是不会
相当神的题目
记录一下序列前缀和
若p+序列和≠q,可以发现取反操作数量是确定的
且尽量在前面做加法,后面做减法
至于旋转操作,暴力想法是把最后一位提前,就相当于连成一个环,在环上求值
所以在环上枚举起点,就相当于移动操作
要是移动不能满足非负,还可以把前面的-操作改为+,对应的后面的+改为-
但暴力走一遍环单纯是为了解决非负的问题
而对于一个起点的序列,若已知其最小值并把它修改至大于0,则显然前后值都不会小于零(想象前缀和)
所以在环上用单调队列求一遍最小值,再枚举起点做无旋转的修改,求最小花费
而题目保证有解题目保证有解题目保证有解
所以除了必要的修改,还需要前后取反时,使最终序列和满足要求的操作一定已经用完了(不论是+变-还是-变+)
那么直接在最小值上加上取反得到的值(一定要大于0),如果还小的话再前后取反
(要是必要的操作是减变加,因为题目有解,所以修改操作一定不在最小值位置之前)
还有好多细节,看代码
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define LL long long
int que[],seq[],mn[];
char opt[];
inline LL abs(LL a){
return a>?a:-a;
}
inline LL max(LL a,LL b){
return a>b?a:b;
}
inline LL min(LL a,LL b){
return a<b?a:b;
}
int main(){
LL n,p,q,x,y;
int i,h,t;
scanf("%lld %lld %lld %lld %lld",&n,&p,&q,&x,&y);
scanf("%s",opt+);
for(i=n<<;i>n;--i)seq[i]=seq[i+]+(opt[i-n]=='+'?:-);
for(i=n;i;--i)seq[i]=seq[i+]+(opt[i]=='+'?:-);
que[]=;
h=,t=;
for(i=n<<;i;--i){
while(h<=t&&seq[i]>seq[que[t]])--t;//seq[i]-seq[que[h]]>seq[que[t]]-seq[que[h]]
que[++t]=i;
while(h<=t&&que[h]-i>=n)++h;
if(i<=n)mn[i]=seq[i]-seq[que[h]]; //你不能用head更新min,只能倒序用i
}
LL all=seq[n+],tmp=(q-p-all)/,ans=1e16,cst;
for(i=;i<n;i++){//枚举起点与枚举旋转次数不同
cst=x*abs(tmp)+y*(LL)i;
if(i==){
mn[]+=p+max(tmp,)*;
if(mn[]<)cst+=*x*((-mn[])/);
}else{
mn[n-i+]+=p+max(tmp,)*;
if(mn[n-i+]<)cst+=*x*((-mn[n-i+])/);
}
ans=min(ans,cst);
}
printf("%lld",ans);
return ;
}
[bzoj1122][POI2008]账本BBB的更多相关文章
- [BZOJ1122][POI2008]账本BBB 单调队列+后缀和
Description 一个长度为n的记账单,+表示存¥1,-表示取¥1.现在发现记账单有问题.一开始本来已经存了¥p,并且知道最后账户上还有¥q.你要把记账单修改正确,使得 1:账户永远不会出现负数 ...
- bzoj 1122 [POI2008]账本BBB 模拟贪心,单调队列
[POI2008]账本BBB Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 524 Solved: 251[Submit][Status][Disc ...
- 【BZOJ1122】[POI2008] 账本BBB
→传送门← 正解: 贪心加单调队列优化 先粘贴一张别人写的被老师发下来给我们的题解(就是看着这张题解才写出来的) 下面是自己的话(一些具体操作过程): 把环拆成一条2*n的链,然后用优先队列来求出每一 ...
- [POI2008]账本BBB
题目 BZOJ 做法 明确: \(~~~1.\)为了达到目标分数所取反的次数是固定的 \(~~~2.\)为了满足前缀非负,得增加取反和滚动次数 滚动的次数可以枚举,增加的取反可以通过最小前缀和得到 滚 ...
- BZOJ 1122 POI2008 账本BBB 单调队列
题目大意:给定一个由+1和−1构成的长度为n的序列,提供两种操作: 1.将某一位取反,花销为x 2.将最后一位移动到前一位.花销为y 要求终于p+sumn=q.且p+sumi≥0(1≤i≤n),求最小 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- [bzoj1122]账本
简化问题:如果没有2操作,答案是多少贪心:修改-一定修改最前面的,修改+一定修改最后面的,正确性显然而通过1操作,要完成两步:1.让最终结果为q:2.让前缀和非负,通过贪心可以获得最小值(具体来说,假 ...
- [BZOJ1112][POI2008]砖块Klo
[BZOJ1112][POI2008]砖块Klo 试题描述 N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另 ...
- BZOJ 1113: [Poi2008]海报PLA
1113: [Poi2008]海报PLA Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1025 Solved: 679[Submit][Statu ...
随机推荐
- python numpy包
在numpy包中我们可以用数组来表示向量,矩阵和高阶数据结构 首先导入numpy包: from numpy import* 初始化numpy数组有多种方式,比如说 1.python列表或元祖 2.使用 ...
- Java注解详解
Java1.5引入了注解,注解作为程序的元数据嵌入到程序中.注解可以被一些解析工具或者编译工具进行解析.我们也可以声明注解在编译过程或者执行时产生作用. 创建Java自定义注解: package co ...
- LinuxStudyNote
LinuxStudyNoteBy_Silvers:(E:\Video_Tutorials\Linux自学视频\linux视频教程-后盾网视频教程)22:25 2016/1/28============ ...
- c#序列化json字符串及处理
上面提到的第四篇文章最后有个解析数组的例子,出现了 .First.First.First.First.Children(); 我表示很晕,网上找的的例子大多数是关于JObject的,但是我很少看到JA ...
- 用自己赚的钱第一次坐飞机 那feel倍儿爽
马年春晚上,歌手大张伟的神曲<倍儿爽>如今已传遍大街小巷.其实,不管人家到底有没有炒作,能让我们这些观众感觉到放松.乐呵,那就是一个成功的春晚节目.而今年,我也如同这歌中唱的一样,活得倍儿 ...
- Java中关于先有鸡还是先有蛋的问题----Class&Object
在Java中,我们常常会看到一个类型:Class.并且在类似Person.class,cache.getClass()等代码中见到它的身影. 众所周知,Class是用来描述一个类的类型,而Object ...
- CentOS7安装ftp服务器
一.问题的提出 想在windows环境下远程连接CentOS的文件并编辑 二.问题的解决 # 安装vsftp服务[root@localhost ~]# yum -y install ftp vsftp ...
- activity 所需jiar包
activity下载后有很多jar包有的jar包不一定用得上,也有些jar是重复的,这里就整理了一下必要的jar包 路径.. \activiti-5.19.0.2\wars\activiti-expl ...
- form提交的几种方法
一. form表单中有 type是submit类型的button,点击 submit,从而会post数据,引发回传. <form action="?" name=" ...
- linux虚拟机上不了网--桥接方式--问题一直未解决
转载的:可是自己的虚拟机就是上不了网,无线网卡该配的也配了还是不行,如果真有台物理机器就行了,省了好多事:但是模拟性能时肯定不行了:有人知道是什么原因不? 虚拟机网络模式 无论是vmware,virt ...