测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A28363. 环线

填空题 困难

题目描述

环线

题目描述

小 A 喜欢坐地铁。地铁环线有n个车站,依次以1,2,...,n 标号。车站 i( 1≤i<n)的下一个车站是车站 。特殊地,车站n的下一个车站是车站1 。

小 A 会从某个车站出发,乘坐地铁环线到某个车站结束行程,这意味着小 A 至少会经过一个车站。小 A 不会经过一个车站多次。当小 A 乘坐地铁环线经过车站i时,小 A 会获得ai点快乐值。请你安排小 A 的行程,选择出发车站与结束车站,使得获得的快乐值总和最大。

输入格式

第一行,一个正整数n ,表示车站的数量。

第二行, n个整数a1,a2,...,an ,分别表示经过每个车站时获得的快乐值。

输出格式

一行,一个整数,表示小 A 能获得的最大快乐值。

样例

输入样例 1

4
-1 2 3 0

输出样例 1

5

输入样例 2

5
-3 4 -5 1 3

输出样例 2

5

数据范围

对于 20% 的测试点,保证 1≤n≤200。

对于 40% 的测试点,保证1≤n≤2000 。

对于所有测试点,保证1≤n≤2×105 ,-109≤ai≤109 。

参考答案

#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; }
上一题 下一题