4681: 【GESP2503六级】环线
内存限制:512 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:3
解决:1
题目描述

输入
第一行,一个正整数$n$ ,表示车站的数量。
第二行,$n$ 个整数$a_1,a_2,...,a_n$ ,分别表示经过每个车站时获得的快乐值。
第二行,$n$ 个整数$a_1,a_2,...,a_n$ ,分别表示经过每个车站时获得的快乐值。
输出
一行,一个整数,表示小 A 能获得的最大快乐值。
样例输入 复制
4
-1 2 3 0
样例输出 复制
5
提示
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 4e5 + 5;
int n;
long long a[N], pre[N];
int q[N], ql, qr;
long long ans;
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%lld", &a[i]);
a[n + i] = a[i];
}
for (int i = 1; i <= 2 * n; i++)
pre[i] = pre[i - 1] + a[i];
ql = qr = 1;
ans = -1e18;
for (int i = 1; i <= 2 * n; i++) {
while (ql <= qr && q[ql] < i - n)
ql++;
ans = max(ans, pre[i] - pre[q[ql]]);
while (ql <= qr && pre[i] < pre[q[qr]])
qr--;
q[++qr] = i;
}
printf("%lld\n", ans);
return 0;
}