题目描述

给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0。请找到最长的一段连续区间,使得该区间内所有数字之和不超过p。

输入格式:

第一行包含三个整数n,p,d(1<=d<=n<=2000000,0<=p<=10^16)。第二行包含n个正整数,依次表示序列中每个数wi

输出格式:

包含一行一个正整数,即修改后能找到的最长的符合条件的区间的长度。

题解:

发现,肯定要选择最多的d变成0,不然不优。并且,如果以i作为结尾,左端点为j的话,那么如果以i+1作为结尾,左端点不可能比j小。

所以,可以用一个双指针,维护L,R,

L、R为一个合法区间条件是,L~R的数的和,减去最大的长度为d的和,总和少于等于p

对于给定R,L不满足的时候,就把L右移即可。

至于L~R中长度等于d的最大的和,可以用一个单调队列维护。

复杂度O(n)

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=+;
int n,d;
ll p;
int ans;
int q[N],l,r;
ll sum[N],a[N];
int main()
{
scanf("%d%lld%d",&n,&p,&d);
for(int i=;i<=n;i++){
scanf("%lld",&a[i]);
sum[i]=sum[i-]+a[i];
}
int L=,R=;
l=,r=;
q[++r]=d;
for(R=d;R<=n;R++){
//cout<<R<<endl;
while(sum[R]-sum[L-]-(sum[q[l]]-sum[q[l]-d])>p){
L++;
while(l<=r&&q[l]-d+<L) l++;
} if(l<=r&&sum[R]-sum[L-]-(sum[q[l]]-sum[q[l]-d])<=p) ans=max(ans,R-L+);
//cout<<L<<endl;
if(R!=n){
while(l<=r&&sum[R+]-sum[R+-d]>sum[q[r]]-sum[q[r]-d]) r--;
q[++r]=R+;
}
}
printf("%d",ans);
return ;
}

[POI2015]WIL-Wilcze doły的更多相关文章

  1. BZOJ 4385: [POI2015]Wilcze doły

    4385: [POI2015]Wilcze doły Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 648  Solved: 263[Submit][ ...

  2. [POI2015]Wilcze doły

    [POI2015]Wilcze doły 题目大意: 给定一个长度为\(n(n\le2\times10^6)\)的数列\(A(1\le A_i\le10^9)\),可以从中选取不超过\(d\)个连续数 ...

  3. 【BZOJ4385】[POI2015]Wilcze doły 单调栈+双指针法

    [BZOJ4385][POI2015]Wilcze doły Description 给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0.请找到最长的一段 ...

  4. 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$,则可行. ...

  5. BZOJ4385[POI2015]Wilcze doły——单调队列+双指针

    题目描述 给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0.请找到最长的一段连续区间,使得该区间内所有数字之和不超过p. 输入 第一行包含三个整数n,p ...

  6. bzoj 4385: [POI2015]Wilcze doły【单调栈】

    对于每个i,以它为左端点的最优右端点一定是单增的,所以用单调栈维护 具体的,单调栈里放的是和单调的长为d的子段,然后枚举右端点,如果这段的和-当前长为d子段最大的和大于p的话,左端点右移同时注意单调栈 ...

  7. 【bzoj4385】[POI2015]Wilcze doły

    单调队列扫描,记录当前区间长度为d的一段的和的最大值,和当前区间和. #include<algorithm> #include<iostream> #include<cs ...

  8. bzoj4385 Wilcze doły

    Description 给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0.请找到最长的一段连续区间,使得该区间内所有数字之和不超过p. Input 第一 ...

  9. bzoj4385 & POJ2015 Wilcze doły

    Description 给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0.请找到最长的一段连续区间,使得该区间内所有数字之和不超过p. Input 第一 ...

  10. [bzoj4385][POI2015]Wilcze doły_单调队列

    Wilcze doły bzoj-4385 POI-2015 题目大意:给定一个n个数的序列,可以将连续的长度不超过d的区间内所有数变成0,求最长的一段区间,使得区间和不超过p. 注释:$1\le n ...

随机推荐

  1. MySQL基础(一)

    首先需要安装MySOL,这里我是在windows环境下安装的,具体教程可以参考https://www.cnblogs.com/xsmile/p/7753984.html,不过要注意安装过程可能会不太顺 ...

  2. 2、Ansible在使用过程中出现的错误解决方法

    1.安装完成后允许命令出错 Traceback (most recent call last): File "/usr/bin/ansible", line 197, in (ru ...

  3. Xiuno BBS 4.0 修改时间显示

    修罗开源轻论坛程序 - Xiuno BBS 4.0Xiuno BBS 4.0 是一款轻论坛产品,前端基于 BootStrap 4.0.JQuery 3,后端基于 PHP/7 MySQL XCache/ ...

  4. python基础_字符编码

    字符编码的历史 阶段一:现代计算机起源于美国,最早诞生也是基于英文考虑的ASCII 阶段二:为了满足中文,中国人定制了GBK 阶段三:各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的 ...

  5. js格式化json字符串和json对象

    1,格式化json对象 var json = {"@odata.context":"$metadata#AddTableOne_466281s","v ...

  6. Java程序设计实验 实验五

    课程:Java程序设计实验   班级:1353  姓名:符余佳源  学号:20135321 成绩:                           指导教师:娄嘉鹏      实验日期:2015. ...

  7. 20162325 金立清 S2 W3 C13

    20162325 2017-2018-2 <程序设计与数据结构>第3周学习总结 教材学习内容概要 查找是在一组项内找到指定目标或是确定目标不存在的过程 高效的查找使得比较的次数最少 Com ...

  8. 《Spring2之站立会议1》

    <Spring2之站立会议1> 昨天,查找了关于建立起服务器和客户端两端的连接的资料,并学习了如何写把两者建立起来的代码: 今天,模仿着相关资料,分别写了客户端和服务器两端的代码: 遇到的 ...

  9. 软工网络15团队作业8——Beta阶段敏捷冲刺(Day5)

    提供当天站立式会议照片一张 每个人的工作 1.讨论项目每个成员的昨天进展 赵铭: 进一步数据整理,写入数据库. 吴慧婷:主页面.查单词页面的改进.背单词界面改进. 陈敏: 单词学习功能及该界面按钮功能 ...

  10. 解决方案~Microsoft Security Client OOBE 程序错误

    Microsoft Security Client OOBE 程序错误 适用于: Windows Windows 7 系统错误日志如下:会话"Microsoft Security Clien ...