目录:
题目:
分析:
用前缀和,我们可以枚举最右边的点,然后取左边合法范围内最小的前缀和,这个我们可以用单调队列进行优化。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<map>
#include<deque>
#include<stack>
#define LL long long
using namespace std;
inline LL read() {
LL d=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
return d*f;
}
deque<int> q;
LL x[300001];
int main()
{
int n=read(),m=read();
q.push_back(0);
long long ans=0;
for(int i=1;i<=n;i++)
{
int a=read();
x[i]=x[i-1]+a;
while(q.size()>0&&q.front()<i-m) q.pop_front();
ans=max(ans,x[i]-x[q.front()]);
while(q.size()>0&&x[q.back()]>=x[i]) q.pop_back();
q.push_back(i);
}
printf("%lld",ans);
return 0;
}