题目描述
解题思路
遍历这 n 个数,求得数组 s , s[i] 代表前 i 项元素和,再有一个递增队列 q 用来维护 s[i-m+1] 到 s[i] 之间的最小值的对应下标,则当前最大子序和为原先最大子序 和 与 s[i] 减去 s[i-m+1] 到 s[i] 之间的最小值的结果 的较大者,遍历完成则答案也随之而来了
代码
#include<iostream>
#define MAX 300000
using namespace std;
long long s[MAX + 5], q[MAX + 5], head = 0, tail = 0, ans = 0;
int main(){
int n, m;
cin >> n >> m;
q[tail++] = 0;
for (int i = 1; i <= n;i++){
cin >> s[i];
s[i] += s[i - 1];
ans = max(ans, s[i] - s[q[head]]);
while(tail-head&&s[q[tail-1]]>=s[i])
tail--;
q[tail++] = i;
if(q[head]==i-m)
head++;
}
cout << ans << endl;
return 0;
}