解题思路
前缀和+单调队列优化
详情请见我的复制粘贴
#include<iostream>
#include<cstdio>
using namespace std;
const int INF=2147483647;
long long sum[200100],ans=-INF,n,k,a[200100],que[200100],head,tail;
long long max(long long x,long long y){
if(x>y)return x;
else return y;
}
int main(){
scanf("%lld%lld",&n,&k);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
sum[i]=sum[i-1]+a[i];
}
head=1,tail=0;
for(int i=1;i<=n;i++){
while(head<=tail&&sum[que[tail]-1]>=sum[i-1])tail--;
que[++tail]=i;
while(head<=tail&&que[head]<i-k+1)head++;
ans=max(ans,sum[i]-sum[que[head]-1]);
}
printf("%lld",ans);
}