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

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

Sample Output

3

Solution

做法:单调队列+后缀和

好难啊这题...

两种操作,我们可以枚举第二种操作的次数,然后算出第一种操作的情况

枚举操作2的话其实就是断链成环,然后枚举起点

对于操作1的求解,我们可以搞个单调队列来弄一下

首先维护一个后缀和,然后用单调队列处理出对于每个起点账本最高能达到多少

然后就分类讨论一下就可以了

如果序列和再加上$p$大于$q$的话就对$+$取反

否则就对后面的$-$取反

#include <bits/stdc++.h>

using namespace std ;

#define ll long long
const int N = 2e6 + ; ll n , p , q , x , y ;
char s[ N ] ;
ll a[ N ] , b[ N ];
ll sum[ N ] ;
deque <int> Q ; int main() {
scanf( "%lld%lld%lld%lld%lld" , &n , &p , &q , &x , &y ) ;
scanf( "%s" , s + ) ;
for( int i = ; i <= n ; i ++ ) {
a[ i ] = s[ i ] == '+' ? : - ;
a[ i + n ] = a[ i ] ;
}
for( int i = n * ; i ; i -- ) {
sum[ i ] = sum[ i + ] + a[ i ] ;
}
for( int i = n * ; i ; i -- ) {
if( i <= n ) b[ i ] = sum[ i ] - sum[ Q.back() ] ;
while( !Q.empty() && sum[ Q.front() ] <= sum[ i ] ) Q.pop_front() ;
Q.push_front( i ) ;
while( Q.back() >= i + n ) Q.pop_back() ;
}
ll ans = 0x7fffffff ;
for( int i = ; i <= n ; i ++ ) {
ll now = y * ( ( n - i + ) % n ) ;
if( p + sum[ n + ] >= q ) now += ( p + sum[ n + ] - q ) / * x ;
else {
now += ( q- p - sum[ n + ] ) / * x ;
b[ i ] += ( q - p - sum[ n + ] ) ;
}
if( p + b[ i ] < ) now -= ( p + b[ i ] - ) / * * x ;
ans = min( ans , now ) ;
}
printf( "%lld\n" , ans ) ;
}

[BZOJ1122][POI2008]账本BBB 单调队列+后缀和的更多相关文章

  1. BZOJ 1122 POI2008 账本BBB 单调队列

    题目大意:给定一个由+1和−1构成的长度为n的序列,提供两种操作: 1.将某一位取反,花销为x 2.将最后一位移动到前一位.花销为y 要求终于p+sumn=q.且p+sumi≥0(1≤i≤n),求最小 ...

  2. [bzoj1122][POI2008]账本BBB

    1122: [POI2008]账本BBB Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 402  Solved: 202[Submit][Status ...

  3. bzoj 1122 [POI2008]账本BBB 模拟贪心,单调队列

    [POI2008]账本BBB Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 524  Solved: 251[Submit][Status][Disc ...

  4. 【BZOJ1122】[POI2008] 账本BBB

    →传送门← 正解: 贪心加单调队列优化 先粘贴一张别人写的被老师发下来给我们的题解(就是看着这张题解才写出来的) 下面是自己的话(一些具体操作过程): 把环拆成一条2*n的链,然后用优先队列来求出每一 ...

  5. [POI2008]账本BBB

    题目 BZOJ 做法 明确: \(~~~1.\)为了达到目标分数所取反的次数是固定的 \(~~~2.\)为了满足前缀非负,得增加取反和滚动次数 滚动的次数可以枚举,增加的取反可以通过最小前缀和得到 滚 ...

  6. bzoj 2806 [Ctsc2012]Cheat——广义后缀自动机+单调队列优化DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2806 只想着怎么用后缀数据结构做,其实应该考虑结合其他算法. 可以二分那个长度 L .设当前 ...

  7. BZOJ.2806.[CTSC2012]Cheat(广义后缀自动机 DP 单调队列)

    题目链接 首先二分答案L.然后就是判断能否将原串划分出一些长度不小于L的子串,这些子串要是给定n个串中的某个串的子串,且满足它们的长度之和不小于原串长度的90%. 贪心多长选一段什么的显然不对.老老实 ...

  8. 【BZOJ2806】Cheat 【广义后缀自动机+单调队列优化dp+二分】

    题意 有M篇标准作文组成了一个作文库(每篇作文都是一个01的字符串),然后给出N篇作文(自然也是01字符串).如果一个长度不小于L的串在作文库中出现过,那么它是熟悉的.对于某一篇作文,我们要把它分为若 ...

  9. 【BZOJ2806】Cheat(后缀自动机,二分答案,动态规划,单调队列)

    [BZOJ2806]Cheat(后缀自动机,二分答案,动态规划,单调队列) 题面 BZOJ 洛谷 题解 很有趣的一道题啊 对于在所有的串上面进行匹配? 很明显的后缀自动机 所以先构建出广义后缀自动机 ...

随机推荐

  1. seajs引入jquery为什么无效?

    简单来说,你的jquery没有模块化? 答案:传送门1.传送门2

  2. Linux中Kill掉进程的10种方法

    常规篇: 首先,用ps查看进程,方法如下: 复制代码 代码如下: $ ps -ef……smx 1822 1 0 11:38 ? 00:00:49 gnome-terminalsmx 1823 1822 ...

  3. pod 的warning一定要注意消除,要不然你的pod配置有问题无法导入

    and the CHANGELOG for this version http://git.io/BaH8pQ. Downloading dependencies Using BlocksKit (2 ...

  4. liferay6.1.2的API

    http://docs.liferay.com/portal/6.1/javadocs/overview-summary.html

  5. [转]C语言四书五经

    我们来说说C语言方面的图书.什么,C语言?有读者奇怪了.没错,这一次的主角就是诞生于1973年如今已经儿孙满堂的C语言.我们之所以要谈及C,不仅仅是因为它的影响深远,这完全可以从C系列语言家族的兴旺发 ...

  6. yii2模板

    GridView 小部件在开发中常用的功能及技巧.持续更新中.... 数据网格或者说 GridView 小部件是Yii中最强大的部件之一.它有一个属性名叫 dataProvider ,这个属性能够提供 ...

  7. Intermediate Python for Data Science learning 2 - Histograms

    Histograms from:https://campus.datacamp.com/courses/intermediate-python-for-data-science/matplotlib? ...

  8. Spring 自动扫描 不支持jar包 <component-scan>

    问题描述: 本机windows myeclipse10.7 运行非maven java项目,其中部分类使用spring3 注解进行注入,使用配置文件component-scan进行扫描,在本机debu ...

  9. 发布QT exe

    https://blog.csdn.net/u014453443/article/details/85837138

  10. python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL

    python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL实战例子:使用pyspider匹配输出带.html结尾的URL:@config(a ...