acwing-135. 最大子序和

考点

  • 单调队列
  • 前缀和

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 3e5 + 50;
int n, m, head, tail, a[maxn], q[maxn];
ll sum[maxn];

int main() {
cin >> n >> m;
ll ans = INT_MIN;
for (int i = 1; i <= n; ++i) cin >> a[i], sum[i] = a[i] + sum[i - 1];
q[tail++] = 0;
for (int i = 1; i <= n; ++i) {
while (head < tail && q[head] < i - m) ++head;
ans = max(ans, sum[i] - sum[q[head]]);
while (head < tail && sum[q[tail - 1]] >= sum[i]) --tail;
q[tail++] = i;
}
cout << ans;
return 0;
}

思路

直接上图。