BZOJ 1122 POI2008 账本BBB 单调队列
题目大意:给定一个由+1和−1构成的长度为n的序列,提供两种操作:
1.将某一位取反,花销为x
2.将最后一位移动到前一位。花销为y
要求终于p+sumn=q。且p+sumi≥0(1≤i≤n),求最小花销
枚举终于的序列以哪个点開始。那么从这个点往后的最小前缀和能够用单调队列预处理出来
然后贪心地把左边的−1改成+1。右边的+1改成−1直到满足要求就可以
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 2002002
using namespace std;
int n,p,q;
long long x,y,ans=0x7fffffffffffffffll;
char s[M];
int sum[M],_min[M];
void Assert(bool flag)
{
if(flag)
return ;
printf("%d\n",1/0);
exit(0);
}
int main()
{
int i;
cin>>n>>p>>q>>x>>y;
scanf("%s",s+1);
for(i=n<<1;i>n;i--)
sum[i]=sum[i+1]+(s[i-n]=='-'?-1:1);
for(i=n;i;i--)
sum[i]=sum[i+1]+(s[i]=='-'?
-1:1);
static int q[M],r,h;
for(i=n<<1;i;i--)
{
while( r-h>=1 && sum[q[r]]<sum[i] )
q[r--]=0;
q[++r]=i;
while( q[h+1]-i>n )
q[++h]=0;
if(i<=n)
_min[i]=sum[i]-sum[q[h+1]];
}
Assert( ~ (::q)-p - sum[n+1] & 1 );
int temp=(::q-p)-sum[n+1]>>1;
for(i=1;i<=n;i++)
{
long long cost=(n-i+1)%n*y+abs(temp)*x;
_min[i]+=p+max(temp,0)*2;
if(_min[i]<0)
cost+=(1-_min[i]>>1)*x*2;
if(cost<ans)
ans=cost;
}
cout<<ans<<endl;
return 0;
}
BZOJ 1122 POI2008 账本BBB 单调队列的更多相关文章
- bzoj 1122 [POI2008]账本BBB 模拟贪心,单调队列
[POI2008]账本BBB Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 524 Solved: 251[Submit][Status][Disc ...
- [BZOJ1122][POI2008]账本BBB 单调队列+后缀和
Description 一个长度为n的记账单,+表示存¥1,-表示取¥1.现在发现记账单有问题.一开始本来已经存了¥p,并且知道最后账户上还有¥q.你要把记账单修改正确,使得 1:账户永远不会出现负数 ...
- [bzoj1122][POI2008]账本BBB
1122: [POI2008]账本BBB Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 402 Solved: 202[Submit][Status ...
- BZOJ 1499 [NOI2005] 瑰丽华尔兹 | 单调队列优化DP
BZOJ 1499 瑰丽华尔兹 | 单调队列优化DP 题意 有一块\(n \times m\)的矩形地面,上面有一些障碍(用'#'表示),其余的是空地(用'.'表示).每时每刻,地面都会向某个方向倾斜 ...
- [POI2008]账本BBB
题目 BZOJ 做法 明确: \(~~~1.\)为了达到目标分数所取反的次数是固定的 \(~~~2.\)为了满足前缀非负,得增加取反和滚动次数 滚动的次数可以枚举,增加的取反可以通过最小前缀和得到 滚 ...
- BZOJ 1047 理想的正方形(单调队列)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1047 题意:给出一个n*m的矩阵.在所有K*K的子矩阵中,最大最小差值最小的是多少? 思 ...
- bzoj 3831 Little Bird (单调队列优化dp)
/*先贴个n*n的*/ #include<iostream> #include<cstdio> #include<cstring> #define maxn 100 ...
- BZOJ 1499 NOI2005 瑰丽华尔兹 单调队列
题目大意:给定一个m*n的地图,一些点有障碍物,钢琴初始在一个点,每一个时间段能够选择向给定的方向移动一段距离,求最长路径长 朴素DP的话,我们有T个时间段,每一个时间段有m*n个点,n个时间,一定会 ...
- BZOJ 1012: [JSOI2008]最大数maxnumber 单调队列/线段树/树状数组/乱搞
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 4750 Solved: 2145[Submi ...
随机推荐
- No-8.其他命令
其他命令 目标 查找文件 find 软链接 ln 打包和压缩 tar 软件安装 apt-get 01. 查找文件 find 命令功能非常强大,通常用来在 特定的目录下 搜索 符合条件的文件 序号 命令 ...
- [LOJ] 分块九题 7
区间加法,区间乘法,单点查询. 洛谷线段树2 屡清加法乘法的关系,定义答案为 a*mut+add 对于整块: 新的乘w,mut和add都要乘w 新的加w,add加w //Stay foolish,st ...
- Jvm:性能调优监控工具
现实企业级Java开发中,有时候我们会碰到下面这些问题: OutOfMemoryError,内存不足 内存泄露 线程死锁 锁争用(Lock Contention) Java进程消耗CPU过高 .... ...
- Linux 配置yum本地安装源
cat /etc/system-release Red Hat Enterprise Linux Server release 7.0 (Maipo) 1 使用本地源得先挂载ISO光盘文件 # 可以创 ...
- C#语言之字符串和正则表达式
本文将完成以下两个目标: 一.创建字符串: 二.正则表达式: 首先,我先来介绍一下System.String类: System.String是一个类,专门用于存储字符串,允许对字符串进行许多操作. 使 ...
- 《C/C++工程师综合练习卷》
前言 前天拿这个<C/C++工程师综合练习卷>练习了一下,现将错题以及精题分析总结. 错题分析与总结 2 . 下面的程序可以从1-.n中随机等概率的输出m个不重复的数.这里我们假设n远大于 ...
- Poj 2337 Catenyms(有向图DFS求欧拉通路)
题意: 给定n个单词, 问是否存在一条欧拉通路(如acm,matal,lack), 如果存在, 输出字典序最小的一条. 分析: 这题可以看作http://www.cnblogs.com/Jadon97 ...
- 根据不同的产品id获得不同的下拉选项 (option传多值)
<td> 没有 value 所以要在<td>里面加上input 同时text 为hidden这样就不会显示value的值 <td><select id='g ...
- reactNative 介绍
React Native (简称RN)是Facebook于2015年4月开源的跨平台移动应用开发框架,是Facebook早先开源的UI框架 React 在原生移动应用平台的衍生产物,目前支持iOS和安 ...
- HDU1021-Fibonacci Again,,找规律就好了~~~
Fibonacci Again Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...