【SSL】2521数数(单调队列)
Time Limit:1000MS
Memory Limit:65536K
思路
用单调队列。
算前缀和。
每插入一个数。
从队尾删除大于x的数。
从队头删除不在范围内的数。
代码
#include<iostream>
#include<cstdio>
#include<deque>
using namespace std;
long long sum[100010];
deque<long long>que;
int main()
{
long long i,n,k,ans=-100000000;
scanf("%lld%lld",&n,&k);
for(i=1;i<=n;i++)
scanf("%lld",&sum[i]),sum[i]+=sum[i-1];
for(i=1;i<=n;i++)
{
for(;!que.empty()&&sum[i]<=sum[que.back()];que.pop_back());//删除大于x的数
que.push_back(i);
for(;!que.empty()&&que.front()<i-k;que.pop_front());//删除不在范围内的数
ans=max(ans,sum[i]-sum[que.front()]);
}
printf("%lld",ans);
return 0;
}