
分析
这题类似于假期那题,都是前缀和+单调队列处理,利用前缀和O(1)算出区间和。
其他的就是常规单调队列处理,要判断区间是否超过k的范围。
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
long long n,k,a[100001],q[100001],ans;
int main()
{
cin>>n>>k;
a[0]=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
a[i]=a[i]+a[i-1];//前缀和
}
int h=1,t=0;
for(int i=1;i<=n;i++)
{
while(h<=t&&a[q[t]]>=a[i])
{
t--;
}
t++;
q[t]=i;
while(h<=t&&q[h]<i-k)
{
h++;
}
ans=max(ans,a[i]-a[q[h]]);//当前的-队头=区间和,因为前缀和预处理
}
cout<<ans;
return 0;
}
本文介绍了一种使用前缀和与单调队列处理区间和问题的高效算法,通过实例讲解了如何在O(1)时间内计算区间和,并保持队列单调性以快速找到最大区间和。
184

被折叠的 条评论
为什么被折叠?



