4681: 【GESP2503六级】环线

内存限制:512 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:3 解决:1

题目描述


输入

第一行,一个正整数$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;
}