[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 ...
随机推荐
- NET基础(3):is 和 as 操作符
在C#语言中进行类型转换的另外一种方式是使用is和as操作符.is检查对象是否兼容于指定类型,返回Boolean值true或false.注意,is操作符永远不抛出异常,例如以下代码: Object o ...
- linux上监控tomcat down掉后自动重启tomcat
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 } p. ...
- LL谱面分析和难度标定
LL谱面分析和难度标定 先介绍一下LL谱面的存储方式:TimeLine序列(简称TL序列),TL序列中的每一个元素(即音符)可以由一个C语言中的结构体来表示: struct note{ int lin ...
- jquery-2.0.0
http://code.jquery.com/jquery-2.0.0.min.js (minified, for production) http://code.jquery.com/jquery- ...
- linux搭建微型git服务器
1.安装git和git-core yum install git git-core -y 2.创建仓库 mkdir /home/git cd /home/git git init 3.设置可以远程pu ...
- C#压缩库SharpZipLib的应用
SharpZipLib是一个开源的C#压缩解压库,应用非常广泛.就像用ADO.NET操作数据库要打开连接.执行命令.关闭连接等多个步骤一样,用SharpZipLib进行压缩和解压也需要多个步骤. ...
- Core 1.0中publishOptions Include的bug
"publishOptions": { "include": [ "wwwroot", "Views", "A ...
- java关键字 super 和 this
简单粗暴的说就是: super: 是指父类,想要在子类方法中调用父类的实例变量或方法可以通过super 来访问 this:是指当前类,想要访问当前类的实例变量和方法可以使用this,同时可以省略
- C# date format 使用C#格式化时间
DateTime dt = DateTime.Now; // Label1.Text = dt.ToString();//2005-11-5 13:21:25 // Label2.Text ...
- 百度api短信开发
公司原来有一个短信发送的功能,是调用第三方的,但是很不稳定,时不时就收不到短信,但是钱已经扣了.对于这样的事,谁都忍受不了的.于是想找一个稳定短信发送平台,第一想到的是阿里云,百度.在这两个平台上公司 ...