分析
( n 3 n^3 n3)——暴力、( n 2 n^2 n2)——前缀和都会超时,所以想到了单调队列,维护单调递增,固定右端点,然后左端点往后推,轻松O(n)。
代码
#include <cstdio>
#include <cctype>
using namespace std;
int n,m; long long ans,q[100001],s[100001];
int in(){
int ans=0,f=1; char c=getchar();
while (!isdigit(c)&&c!='-') c=getchar();
if (c=='-') c=getchar(),f=-f;
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans*f;
}
long long max(long long a,long long b){return (a>b)?a:b;}
int main(){
n=in(); m=in(); q[1]=0; int l=1,r=1;
for (int i=1;i<=n;i++) s[i]=s[i-1]+in();
for (int i=1;i<=n;i++){
while (l<=r&&q[l]<i-m) l++;//左端点超过要求
ans=max(ans,s[i]-s[q[l]]);//前缀和
while (l<=r&&s[q[r]]>=s[i]) r--;//维护单调递增
q[++r]=i;//入队
}
return !printf("%lld",ans);
}