题目传送门

很不错的一道单调队列神题


可以发现,当我们向右移动右端点时,左端点也会向右移动或不动。所以我们可以从左向右移动右端点,以上一个区间的左端点作为这个区间的左端点,然后将左端点右移,直到这个区间为一个合法区间。

为了判断区间是否合法,我们可以维护每个元素的前缀和,从而得到每段长为\(d\)的区间的和。之后移动左端点时,就可以用这段区间的区间和减去区间内长度为\(d\)的最大区间和。

快速求出长度为\(d\)的最大区间,我们可以用单调队列来维护。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
LL read(){LL k=0,f=1; char c=getchar();for(;c<'0'||c>'9';c=getchar())if(c=='-') f=-1;for(;c>='0'&&c<='9';c=getchar())k=k*10+c-48;return k*f;
}
LL a[2000010],sum[2000010];
LL q[2000010],h=1,t;
int main(){LL n=read(),p=read(),d=read();for(int i=1;i<=n;i++) a[i]=read()+a[i-1];  //前缀和for(int i=d;i<=n;i++) sum[i]=a[i]-a[i-d];  //长度为d,右端点为i的区间和int ans=d,last=1; q[++t]=d;  //初始化for(int i=d+1;i<=n;i++){while(sum[q[t]]<sum[i]&&h<=t) --t;  //维护单调队列q[++t]=i;while(q[h]-d+1<last&&h<=t) ++h;  //当最大值的左端点不在这个区间里,需要将它出队while(h<=t&&a[i]-a[last-1]-sum[q[h]]>p){ //向右移动左端点,直到区间合法last++;while(q[h]-d+1<last&&h<=t) ++h;  //随着左端点右移,要时刻注意最大值的合法性}ans=max(ans,i-last+1);}cout<<ans;return 0;
}

转载于:https://www.cnblogs.com/wxl-Ezio/p/9896651.html

POI2015 WIL-Wilcze doły相关推荐

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

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

  2. bzoj4385 POJ2015 Wilcze doły

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

  3. 中国地质大学英语语音学习笔记(五):英语连读——相邻两元音读音(词间或词内)的连读方法和辅音加半元音(词间或词内)的连读技巧

    前言   本笔记整理于中国地质大学(武汉)的一门英语发音课程:英语语音,的第十一.十二单元的文档资料,主要是连读技巧.包括半元音,用半元音/w/和/j/衔接元音的连读,用卷舌音/r/衔接元音的连读等, ...

  4. linux 内核配置简介

    Gentoo Linux Gentoo内核(gentoo-sources)特有的选项 Gentoo Linux support CONFIG_GENTOO_LINUX 选"Y"后, ...

  5. java知识精华总结

    Java 知识--精华总结 一. -java 概述与基础知识-6 1.何为编程?-6 2.Java 语言概述,历史.特点- 6 3.什么是跨平台性?原理是什么?JVM- 7 4.Jre 和 Jdk 的 ...

  6. P3594 [POI2015]WIL-Wilcze doły

    https://www.luogu.org/problemnew/show/P3594 思路:尺取+单调队列维护d长度区间最大值: #include<algorithm> #include ...

  7. BZOJ 4385 洛谷3594 POI2015 WIL-Wilcze doły

    [题解] 手残写错调了好久QAQ...... 洛谷的数据似乎比较水.. n个正整数!!这很重要 这道题是个类似two pointer的思想,外加一个单调队列维护当前区间内长度为d的子序列中元素之和的最 ...

  8. Luogu P3594 [POI2015]WIL-Wilcze doły(单调队列)

    传送门 题面: 题解: 首先我们要发现,假如右端点为 i i i ,能到达的最远的左端点为 j j j 时,那么 右端点为 i + 1 i+1 i+1 时,能到达的最远左端点一定大于等于 j j j ...

  9. [洛谷]P3594 [POI2015]WIL-Wilcze doły (#单调队列)

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

  10. 洛谷 P3594 [POI2015]WIL-Wilcze doły 题解

    题目链接 以前听人讲过,现在全都忘了QwQ,特此写一个题解 首先,为了选到的区间尽可能的长,我们要把该的区间中尽可能多的数变为 0 0 0,并且满足消掉的数字和尽可能大. 我们考虑用双指针维护区间 [ ...

最新文章

  1. 从大数据技术参考模型角度梳理大数据标准
  2. 10.ASCII码对照
  3. CentOS 6.3 升级软件 gcc等,并安装部署DNN环境 (未完成,不完整)
  4. ITK:创建一个向量
  5. Django model反向关联名称的方法(转)
  6. Java Float类floatToIntBits()方法与示例
  7. oracle 移动日志文件,Oracle数据库移动数据文件、日志文件和控制文件
  8. 46 WM配置-作业-库存盘点-维护编码范围(盘点凭证和转储单TO)
  9. java 放行文件_springmvc中关于静态资源的放行
  10. php虚拟机java虚拟机,Java虚拟机的具体详解
  11. c语言 camp;gt与camp;lt,那位高人告诉我怎么复习c语言二级啊?????
  12. 虚幻学习4---制作实时逼真的毛发【笔记】
  13. 本体技术视点 | 为什么 BIP - 340 选择引入 Schnorr 签名算法?
  14. 奇虎360面经:测试
  15. android 多个按键精灵,Android 一种通用的按键精灵的实现思路
  16. 杨绛先生70句金句,请珍藏
  17. eXo Platform 3.0访谈
  18. 用c语言 在图形状态下 编动画,用C语言实坝图形动画设计.pdf
  19. cobbler集成服务器批量安装操作系统(无人值守)
  20. android 实现自动拍照,android实现定时拍照功能

热门文章

  1. 一个用C#开发的操作系统的开源项目
  2. matlab欧拉法原理,欧拉法函数
  3. 辉光管时钟学习制作及开源软硬件工程
  4. 硬件电路设计报告总结
  5. 时间序列预测之为何舍弃LSTM而选择Informer?(Informer模型解读)
  6. 问题导向VS目标导向:领导者要倾向哪种?
  7. 计算机控制技术在自动驾驶应用分析,计算机视觉在自动驾驶中的应用探讨
  8. Java8学习--Map的compute方法
  9. 湖北武汉机械员考试机械员的从业心理状态分析建筑七大员考试
  10. 刘一男词汇课(从shift到string):“重复是记忆之母,理解是记忆之父。“