【BZOJ4385】[POI2015]Wilcze doły 单调栈+双指针法
【BZOJ4385】[POI2015]Wilcze doły
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。
题解:易知我们向[l,r]中加入一个数r+1,得到的[l,r+1]的区间和(修改后)肯定比[l,r]要大,这显然满足双指针法的条件
所以我们还要动态维护[l,r]中,和最大的长度为d的区间,也就是维护区间最大值,这显然又可以用单调队列来搞定,所以这道题将两个单调数据结构套在了一起,不过并不难
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int maxn=2000010;
int n,d,ans;
int q[maxn];
long long p,s[maxn],v[maxn];
int main()
{
scanf("%d%lld%d",&n,&p,&d);
int i,h=1,t=0,j=0;
for(i=1;i<=n;i++) scanf("%d",&s[i]),s[i]=s[i-1]+s[i];
ans=d;
for(i=d;i<=n;i++)
{
while(h<=t&&s[i]-s[i-d]>=s[q[t]]-s[q[t]-d]) t--;
q[++t]=i;
while(h<=t&&s[i]-s[j]-s[q[h]]+s[q[h]-d]>p)
{
j++;
if(q[h]<j+d) h++;
}
ans=max(ans,i-j);
}
printf("%d",ans);
return 0;
}
【BZOJ4385】[POI2015]Wilcze doły 单调栈+双指针法的更多相关文章
- BZOJ4385[POI2015]Wilcze doły——单调队列+双指针
题目描述 给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0.请找到最长的一段连续区间,使得该区间内所有数字之和不超过p. 输入 第一行包含三个整数n,p ...
- [bzoj4385][POI2015]Wilcze doły_单调队列
Wilcze doły bzoj-4385 POI-2015 题目大意:给定一个n个数的序列,可以将连续的长度不超过d的区间内所有数变成0,求最长的一段区间,使得区间和不超过p. 注释:$1\le n ...
- 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$,则可行. ...
- BZOJ 4385: [POI2015]Wilcze doły
4385: [POI2015]Wilcze doły Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 648 Solved: 263[Submit][ ...
- [POI2015]Wilcze doły
[POI2015]Wilcze doły 题目大意: 给定一个长度为\(n(n\le2\times10^6)\)的数列\(A(1\le A_i\le10^9)\),可以从中选取不超过\(d\)个连续数 ...
- bzoj 4385: [POI2015]Wilcze doły【单调栈】
对于每个i,以它为左端点的最优右端点一定是单增的,所以用单调栈维护 具体的,单调栈里放的是和单调的长为d的子段,然后枚举右端点,如果这段的和-当前长为d子段最大的和大于p的话,左端点右移同时注意单调栈 ...
- 【bzoj4385】[POI2015]Wilcze doły
单调队列扫描,记录当前区间长度为d的一段的和的最大值,和当前区间和. #include<algorithm> #include<iostream> #include<cs ...
- bzoj4385 & POJ2015 Wilcze doły
Description 给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0.请找到最长的一段连续区间,使得该区间内所有数字之和不超过p. Input 第一 ...
- DP的各种优化(动态规划,决策单调性,斜率优化,带权二分,单调栈,单调队列)
前缀和优化 当DP过程中需要反复从一个求和式转移的话,可以先把它预处理一下.运算一般都要满足可减性. 比较naive就不展开了. 题目 [Todo]洛谷P2513 [HAOI2009]逆序对数列 [D ...
随机推荐
- test_login
import unittest,requestsimport ddtfrom BeautifulReport import BeautifulReport as bffrom urllib impor ...
- R快速创建个文件
cat("TITLE extra line", "2 3 5 7", "11 13 17", file="ex.data" ...
- 【转】H.264(H264)视频文件的制作
转自:http://blog.csdn.net/caoshangpa/article/details/51166109 一.准备工作 1.下载并安装优酷客户端 2.下载ffmpeg可执行文件,解压可用 ...
- python hello wlord
入门运行第一个python程序 https://www.python.org/ 官网下载最新python3安装到电脑 安装成功 cmd进入到安装目录 1.在cmd中直接进入到python安装目录 编写 ...
- javascript跨域訪问探索之旅
需求: 近期工作负责一个互联网应用A(我公司应用)与还有一个互联网应用B进行通讯.通讯的方式是这种:还有一个互联网应用某些表单信息须要从我公司的互联网应用获取.首先用户訪问互联网应用B ...
- DDR3调试总结
DDR3调试总结 本文为原创,转载请注明作者与出处 http://blog.csdn.net/hanfei_1/article/details/70546010 以前同是DDR3的无知少年,由于项目需 ...
- C# ZPL II 命令打印标签
public class BarPrinter { public static byte[] ZPLPrinter(string p_title = "", string p_sp ...
- iOS图片上传及压缩
提到从摄像头/相册获取图片是面向终端用户的,由用户去浏览并选择图片为程序使用.在这里,我们需要过UIImagePickerController类来和用户交互. 使用UIImagePickerContr ...
- C/C++开发平时用的自定义debug函数
一.无颜色版 一.自定义printf #include <stdio.h> #ifdef MYDEBUG #define DEBUG(arg...) {\ printf("[de ...
- js arguments 内置对象
1.arguments是js的内置对象. 2.在不确定对象是可以用来重载函数. 3.用法如下: function goTo() { var i=arguments.length; alert(i); ...