[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 ...
随机推荐
- AIX UNIX 系统管理、维护与高可用集群建设——数据库结构设计
在对数据库类应用进行优化的过程中我们了解到一个原则,即思想上要从结构设计抓起,按照下面的顺序: 1.数据库逻辑结构设计和物理设计. 2.数据库对象部署和SQL代码编写. 3.数据库实例性能调整和优化. ...
- 亿级Web系统搭建——单机到分布式集群
当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会遇到很多的问题.为了解决这些性能压力带来问题,我们需要在Web系统架构层 ...
- 彻底卸载Oracle
彻底卸载Oracle 用Oracle自带的卸载程序不能从根本上卸载Oracle,从而为下次的安装留下隐患,那么怎么才能完全卸载Oracle呢?那就是直接注册表清除,步骤如下: 1. 开始->设置 ...
- Buge's Fibonacci Number Problem
Buge's Fibonacci Number Problem Description snowingsea is having Buge’s discrete mathematics lesson, ...
- C#调用RAR压缩与解压
public void RARsave(string rarPatch, string rarFiles,string patch,string rarName) { ...
- JSP 实现◆菱形 三角形△ 的输出
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- Netsuite SuiteScript > Search Advance feature,搜索中使用 'OR' operation
Sample in online help //Define search filter expression var filterExpression = [ [ 'trandate', 'onOr ...
- Poj2186Popular Cows
Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 31533 Accepted: 12817 De ...
- intel82599在centos6.5下编译安装
.intel驱动下载地址:https://sourceforge.net/projects/e1000/files/ixgbe%20stable/ .编译安装步骤 yum install kernel ...
- javascript 字符串多行的写法
多行写法! $('#' +xx ).append ( '<div id="' + file.id + '" class="">\ <div c ...