较水。
单调队列扫一遍即可。
#include<bits/stdc++.h>
using namespace std;
typedef int INT;
#define int long long
const int N=4e6+500;
inline char nc(){
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline void read(int &x){
x=0;
int f=1;
char ch=nc();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-1;
ch=nc();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=nc();
}
x*=f;
}
int n,p,d;
int a[N]={};
int sum[N]={};
int g[N]={};
int q[N]={};
int head,tail;
INT main(){
read(n);
read(p);
read(d);
for(int i=1;i<=n;i++){
read(a[i]);
sum[i]=sum[i-1]+a[i];
}
for(int i=0;i<=n;i++){
if(i+d>n)
g[i]=sum[n]-sum[i];
else g[i]=sum[i+d]-sum[i];
}
q[1]=0;
head=1;
tail=1;
int ans=d,idx=0;
for(int i=d+1;i<=n;i++){
while(head<=tail&&g[q[tail]]<=g[i-d])tail--;
tail++;
q[tail]=i-d;
// idx=0;
while(head<=tail&&idx<i-d&&p<(sum[i]-sum[idx]-g[q[head]])){
idx++;
while(q[head]<idx)head++;
}
ans=max(ans,i-idx);
}
cout<<ans;
}