第一篇题解确实会被讨论区里的数据hack掉,那么就随便水一个不会被hack掉的题解吧

首先我们尝试着发现这道题的一些结论,你就会发现答案是单调的不降的

这里的答案不降指的是选择每一个位置\(i\)作为结尾能形成的最长区间的左端点是单调不降的,这个很好证明,将\(i-1\)这个位置作为结尾形成的最长区间的左端点不可能比\(i\)作为结尾形成的最长区间的左端点更靠右

如果更靠右的话,那么\(i-1\)形成的区间还能更靠左一些,这与我们的假设不符,所以这个结论是成立的

之后我们就可以利用这个结论计算每一个\(i\)为结尾的区间的左端点在哪里了

由于\(i\)的左端点不可能比\(i-1\)的更靠左,所以我们就直接来将\(i-1\)的左端点\(last\)为起始端点就好了

如果\(p[i]-p[last-1]\)即这段区间的和减去这个区间内所有长度为\(d\)的区间和的最大值还是超过\(p\),那么我们就让\(last++\),直到满足条件为止

至于怎么维护一个区间内所有长度为\(d\)的区间和的最大值,我们用一个单调队列就好了

时间复杂度其实是均摊了两次,但是还是非常优秀的\(O(n)\)

代码

#include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
#define re register
#define maxn 2000005
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define LL unsigned long long
LL n,p,d;
LL a[maxn],pre[maxn];
LL ans,t[maxn],last;
inline LL read()
{
LL x=0;
char c=getchar();
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9')
x=x*10+c-48,c=getchar();
return x;
}
int main()
{
n=read();
p=read();
d=read();
for(re int i=1;i<=n;i++)
a[i]=read();
for(re int i=1;i<=n;i++)
pre[i]=pre[i-1]+a[i];
std::deque<int> q;
for(re int i=d;i<=n;i++)
t[i]=pre[i]-pre[i-d];//t[i]表示[i-d+1,i]这个区间的和
ans=d;//最开始ans为d
q.push_back(d);
last=1;
for(re int i=d+1;i<=n;i++)
{
while(!q.empty()&&t[i]>t[q.back()]) q.pop_back();
q.push_back(i);//在队尾加入一个元素
while(!q.empty()&&q.front()-d+1<last) q.pop_front();
//,如果队首元素的左端点比last还小,那么就弹出不合法的队首元素
while(!q.empty()&&pre[i]-pre[last-1]-t[q.front()]>p)
{
last++;
while(!q.empty()&&q.front()-d+1<last) q.pop_front();
//last++后也要维护队首的合法性
}
ans=max(ans,i-last+1);
}
std::cout<<ans;
return 0;
}

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

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

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

  2. P3588 【[POI2015]PUS】(线段树优化建边)

    P3588 [[POI2015]PUS] 终于有个能让我一遍过的题了,写篇题解纪念一下 给定长度为n的序列和其中部分已知的数,还有m个大小关系:区间\([l,r]\)中,有k个给定的数比剩下的\(r- ...

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

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

  4. [POI2015]Wilcze doły

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

  5. 【十大经典数据挖掘算法】EM

    [十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 极大似然 极大似然(Maxim ...

  6. 【十大经典数据挖掘算法】AdaBoost

    [十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 集成学习 集成学习(ensem ...

  7. 【十大经典数据挖掘算法】Naïve Bayes

    [十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 朴素贝叶斯(Naïve Bayes) ...

  8. 【十大经典数据挖掘算法】Apriori

    [十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 关联分析 关联分析是一类非常有 ...

  9. 【十大经典数据挖掘算法】kNN

    [十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 引言 顶级数据挖掘会议ICDM ...

  10. 【linux草鞋应用编程系列】_6_ 重定向和VT100编程

    一.文件重定向     我们知道在linux shell 编程的时候,可以使用文件重定向功能,如下所示: [root@localhost pipe]# echo "hello world&q ...

随机推荐

  1. JavaScript对象中的constructor属性

    constructor属性始终指向创建当前对象的构造函数. 比如下面的例子: // 等价于 var foo = new Array(1, 56, 34, 12); var arr = [1, 56, ...

  2. 一:Maven知识整理

    一:maven的好处 1.依赖管理:对jar包的统一管理 可以节省空间 2.项目一键构建: 编码 编译 测试(junit) 运行 打包 部署 一个 tomcat:run就能把项目运行起来 Maven能 ...

  3. split 将字符串分割成字符串数组

    list_name = list_name.split(","); split() 方法用于把一个字符串分割成字符串数组. 语法 stringObject.split(separa ...

  4. Java温故而知新(2)多线程详解

    多线程指的是在单个程序中可以同时运行多个同的线程执行不同的任务.线程是程序内的顺序控制流,只能使用分配给序的资源和环境.     一.线程与进程的区别 多个进程的内部数据和状态都是完全独立的,而多线程 ...

  5. ccf-201709-2 公共钥匙盒

    问题描述 有一个学校的老师共用N个教室,按照规定,所有的钥匙都必须放在公共钥匙盒里,老师不能带钥匙回家.每次老师上课前,都从公共钥匙盒里找到自己上课的教室的钥匙去开门,上完课后,再将钥匙放回到钥匙盒中 ...

  6. Hello Activemq

    0. 如果永远是localhost 可能一直low下去 1.下载安装 activemq 1.1 从官网下载activemq.tar.gz 并上传(rz)到linux系统 并解压 tar zxvf /* ...

  7. jQuery filter() , end()

    1. jquery filter(condition) :  过滤指定对象中符合条件的元素: 2.  jquery  end() : 回到原来的操作对象 3.  example : <body& ...

  8. pv-date-handle

    pv-date-handle 这是一个时间格式化转换的小工具,简单易用 ## 快速开始 安装`npm install pv-date-handle -S` ```js import formateDa ...

  9. sql-case when,row_number

    --排序 select Row_Number() over(order by a.UserName) as Num --区分性别 then '男' else '女' end SexName Sqlse ...

  10. codeforces之始

    很早就听说acmer界的CF嘞!还记得刚开始听到神犇们在讨论CF的时候我还以为是网游CF(穿越火线)呢... 今年刚开学的时候就打算开始打cf的,由于一些事情耽搁了.之后又要准备省赛所以就一直拖到现在 ...