AcWing 135. 最大子序和
原题链接
简单
作者:
帅
,
2020-09-05 08:18:25
,
所有人可见
,
阅读 455
C++ 代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6+6;
int n, m;
ll a[maxn]; //原数组
ll f[maxn], sum[maxn]; //模仿单调队列数组, 前缀和数组
int main()
{
scanf("%d%d",&n,&m);
for(int i = 1; i <= n; i ++)
{
scanf("%lld",&a[i]);
sum[i] = a[i] + sum[i-1]; //求前缀和
}
ll maxi = -1;
int start = 0, end = 0; //单调队列的头与尾
for(int i = 1; i <= n; i ++)
{
if(i - f[start] > m) start ++; //如果队列内元素大于m则删除队头元素
maxi = max(maxi, sum[i]-sum[f[start]]); //求结果
while(start <= end&& sum[f[end]] >= sum[i]) end --;//当目前要进入的元素大于队位元素,则删除队尾元素
f[++ end] = i;//将当前元素放入队列中
}
cout << maxi << endl;
return 0;
}