题目链接
http://noi-test.zzstep.com/contest/0x10%E3%80%8C%E5%9F%BA%E6%9C%AC%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E3%80%8D%E4%BE%8B%E9%A2%98/1201%20%E6%9C%80%E5%A4%A7%E5%AD%90%E5%BA%8F%E5%92%8C
分析
滑动窗口模板,注意序列第一个元素作为子段左端点的情况。
AC代码
#include <cstdio>
inline int read() {
int num = 0, flag = 1;
char c = getchar();
while (c < '0' || c > '9') {
if (c == '-') flag = -1;
c = getchar();
}
while (c >= '0' && c <= '9')
num = num * 10 + c - '0', c = getchar();
return flag * num;
}
const int maxn = 3e5 + 5;
int sum[maxn], q[maxn];
int main() {
int n = read(), m = read();
for (int i = 1; i <= n; ++i) sum[i] = sum[i - 1] + read();
int l = 1, r = 0, ans = -0x7fffffff;
q[++r] = 0;
for (int i = 1; i <= n; ++i) {
if (l <= r && i - q[l] > m) ++l;
if (sum[i] - sum[q[l]] > ans) ans = sum[i] - sum[q[l]];
while (l <= r &&sum[i] <= sum[q[r]]) --r;
q[++r] = i;
}
printf("%d", ans);
return 0;
}