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