BZOJ 4385: [POI2015]Wilcze doły
4385: [POI2015]Wilcze doły
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 648 Solved: 263
[Submit][Status][Discuss]
Description
给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0。
请找到最长的一段连续区间,使得该区间内所有数字之和不超过p。
Input
第一行包含三个整数n,p,d(1<=d<=n<=2000000,0<=p<=10^16)。
第二行包含n个正整数,依次表示序列中每个数w[i](1<=w[i]<=10^9)。
Output
包含一行一个正整数,即修改后能找到的最长的符合条件的区间的长度。
Sample Input
3 4 1 9 4 1 7 1 3
Sample Output
HINT
将第4个和第5个数修改为0,然后可以选出区间[2,6],总和为4+1+0+0+1=6。
Source
分析
显然单调队列O(N)扫过去即可,就是注意优化常数。
代码
- #include <cstdio>
- #include <cstdlib>
- #include <cstring>
- #include <iostream>
- #include <algorithm>
- using namespace std;
- #define gc getchar
- #define add(x,y) x=x*10+y-'0'
- template <class T>
- __inline void read(T &x)
- {
- x = ; char c = gc();
- while (c < '')
- c = gc();
- while (c >= '')add(x,c),
- c = gc();
- }
- #define mem(x) memset(x,0,sizeof(x))
- #define rep(x) for(int i=1;i<=x;++i)
- #define ll long long
- #define LL long long
- #define N 4000005
- int n;
- int d;
- int num[N];
- int que[N];
- LL p;
- LL sum[N];
- LL mex[N];
- signed main(void)
- {
- read(n);
- read(p);
- read(d);
- rep(n)read(num[i]);
- rep(n)sum[i] = sum[i - ] + num[i];
- rep(n - d + )mex[i] = sum[i + d - ] - sum[i - ];
- int h = , t = , lt = , ans = ;
- for (int i = d; i <= n; ++i)
- {
- while (h < t && mex[que[t - ]] <= mex[i - d + ])
- --t;
- que[t++] = i - d + ;
- while (sum[i] - sum[lt] - mex[que[h]] > p)
- {
- ++lt; while (que[h] <= lt)++h;
- }
- if (i - lt > ans)ans = i - lt;
- }
- printf("%d\n", ans);
- }
BZOJ_4385.cpp
- #include <bits/stdc++.h>
- typedef long long longint;
- const int maxn = ;
- int n;
- int d;
- int num[maxn];
- int que[maxn];
- longint p;
- longint sum[maxn];
- longint mex[maxn];
- signed main(void)
- {
- scanf("%d%lld%d", &n, &p, &d);
- for (int i = ; i <= n; ++i)
- scanf("%d", num + i);
- for (int i = ; i <= n; ++i)
- sum[i] = sum[i - ] + num[i];
- for (int i = ; i <= n - d + ; ++i)
- mex[i] = sum[i + d - ] - sum[i - ];
- int head = , tail = , left = , answer = ;
- for (int i = d; i <= n; ++i) {
- while (head < tail && mex[que[tail - ]] <= mex[i - d + ])
- --tail; // queue pop back
- que[tail++] = i - d + ;
- while (sum[i] - sum[left] - mex[que[head]] > p) {
- ++left;
- while (que[head] <= left)
- ++head; // queue pop front
- }
- if (answer < i - left)
- answer = i - left;
- }
- printf("%d\n", answer);
- }
BZOJ_4385.cpp
@Author: YouSiki
BZOJ 4385: [POI2015]Wilcze doły的更多相关文章
- bzoj 4385: [POI2015]Wilcze doły【单调栈】
对于每个i,以它为左端点的最优右端点一定是单增的,所以用单调栈维护 具体的,单调栈里放的是和单调的长为d的子段,然后枚举右端点,如果这段的和-当前长为d子段最大的和大于p的话,左端点右移同时注意单调栈 ...
- [POI2015]Wilcze doły
[POI2015]Wilcze doły 题目大意: 给定一个长度为\(n(n\le2\times10^6)\)的数列\(A(1\le A_i\le10^9)\),可以从中选取不超过\(d\)个连续数 ...
- 【BZOJ4385】[POI2015]Wilcze doły 单调栈+双指针法
[BZOJ4385][POI2015]Wilcze doły Description 给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0.请找到最长的一段 ...
- BZOJ4385 : [POI2015]Wilcze doły
求出前缀和$s$,设$f[i]=s[i+d-1]-s[i-1]$. 从左到右枚举的右端点$i$,左端点$j$满足单调性,若$s[i]-s[j-1]-\max(区间内最大的f)\leq p$,则可行. ...
- BZOJ4385[POI2015]Wilcze doły——单调队列+双指针
题目描述 给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0.请找到最长的一段连续区间,使得该区间内所有数字之和不超过p. 输入 第一行包含三个整数n,p ...
- 【bzoj4385】[POI2015]Wilcze doły
单调队列扫描,记录当前区间长度为d的一段的和的最大值,和当前区间和. #include<algorithm> #include<iostream> #include<cs ...
- [bzoj4385][POI2015]Wilcze doły_单调队列
Wilcze doły bzoj-4385 POI-2015 题目大意:给定一个n个数的序列,可以将连续的长度不超过d的区间内所有数变成0,求最长的一段区间,使得区间和不超过p. 注释:$1\le n ...
- P3594 [POI2015]WIL-Wilcze doły
P3594 [POI2015]WIL-Wilcze doły 题目描述 给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0.请找到最长的一段连续区间,使得 ...
- bzoj 4386: [POI2015]Wycieczki
bzoj 4386: [POI2015]Wycieczki 这题什么素质,爆long long就算了,连int128都爆……最后还是用long double卡过的……而且可能是我本身自带大常数吧,T了 ...
随机推荐
- 配置Tomcat使用Redis作为session管理
1. 在 tomcat/lib 中增加以下jar包 commons-pool2-.jar jedis-.jar tomcat-redis-session-manager-.jar 2. 修改tomca ...
- Debian 8(Jessie) 安装自带Mysql
执行命令 sudo apt-get install mysql-server 这会把mysql-client也装上, 版本都是5.5. 安装过程中会提示你输入两遍root口令. 用ps aux|gre ...
- EEG montage
Source: WikiPedia - Electroencephalography Since an EEG voltage signal represents a difference betwe ...
- “Word自动更改后的内容保存到通用文档模板上。是否加载该模板?“的解决办法
在win7系统下,Word2010出现了不能正常关闭.打开一个已有word文档,点击右上角关闭按钮后,先提示"word已停止工作,windows正在检查该问题的解决方案",随后提示 ...
- scala 学习笔记(03) 参数缺省值、不定个数参数、类的属性(Property)、泛型初步
继续学习,这一篇主要是通过scala来吐槽java的,同样是jvm上的语言,差距咋就这么大呢? 作为一个有.NET开发经验的程序员,当初刚接触java时,相信很多人对java语言有以下不爽(只列了极小 ...
- 一个Java Dao测试用例
import static org.junit.Assert.assertTrue; import java.util.Date; import java.util.HashMap; import j ...
- Theano2.1.9-基础知识之条件
来自:http://deeplearning.net/software/theano/tutorial/conditions.html conditions 一.IfElse vs Switch 这两 ...
- 在线程中调用SaveFileDialog
在多线程编程中,有时候可能需要在单独线程中执行某些操作.例如,调用SaveFileDialog类保存文件.首先,我们在Main方法中创建了一个新线程,并将其指向要执行的委托SaveFileAsyn.在 ...
- IE对象最后一个属性后不要加逗号,否则在IE7及以下版本中会报错
某函数返回一个对象,如果在最后一个属性后加逗号,IE7及以下版本中会报错 正确代码: return{ top:rect.top-top, bottom:rect.bottom-top, left:re ...
- ajax 跨域提交数据
$.ajax({ url:"http://my.demo.com/jsonp/server.php",//不同域的文件; cache: false, //是否使用缓存; error ...