题解:本题主要考查单调队列
简要题意:取连续的k(k<=m)个数,求其中所有可能的最大值。
1.前缀和:求的是连续最值很自然用前缀和求,注意k<=m。
2.单调队列:维护单调队列,不在范围内要出队
代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,h=1,t=1,ans=-99;
int q[953569],a[977541];
int main()
{
cin>>n>>m;
q[1]=0;
for(int i=1;i<=n;i++){cin>>a[i];a[i]+=a[i-1];}
for(int i=1;i<=n;i++)
{
while(h<=t&&q[h]<i-m)h++;
ans=max(ans,a[i]-a[q[h]]);
while(h<=t&&a[i]<=a[q[t]])t--;
q[++t]=i;
}
cout<<ans;
return 0;
}