题目大意:
题目链接:http://10.156.17.250/JudgeOnline/showproblem?problem_id=2521(学校局域网)
给出一个数列,求长度不超过的连续字段,且总和最大。
思路:
单调队列模板题。首先使用前缀和,然后利用单调队列优化,每次保证数列单调递增,可以将时间优化到。
代码:
#include <cstdio>
#include <queue>
#include <iostream>
#define Inf 1e17
using namespace std;
int n,m;
long long ans,sum[100001];
deque<long long> q; //双端队列
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
{
scanf("%lld",sum+i);
sum[i]+=sum[i-1]; //前缀和
}
q.push_back(0);
ans=-Inf;
for (int i=1;i<=n;i++)
{
while (q.size()&&i-m>q.front())
q.pop_front(); //不能超过范围
if (q.size())
ans=max(ans,sum[i]-sum[q.front()]); //求答案
while (q.size()&&sum[q.back()]>sum[i])
q.pop_back(); //保持单调
q.push_back(i);
}
cout<<ans;
return 0;
}