前言
提供一种考场上想到的线段树乱搞解法。
题目简介
一个环上有
n 个点,第
i 个点权值为
ai,当你来到一个点,就能取得这个点的权值。问:在最多绕一圈(经过
n 个点)的情况下所能取到的最多的权值。
题解
先考虑暴力做法:
先断环为链,并维护一个前缀和数组
sum,枚举两个点
i,j,保证
1≤i<j≤2n,找出
sumj−sumi 的最大值即可。时间复杂度
O(n2)。
这样显然会超时。考虑优化:
不难看出,在
sumi 一定时,
sumj 越大,结果就越大,也就越有可能冲击最优解。又因为
i<j≤2n,所以
sumj−sumi 的最大值就是
maxi<j≤2nsumj−sumi。于是问题就变成了寻找区间最大值,可以用线段树在
O(logn) 的时间内解出。这样,总的时间复杂度就变成了
O(nlogn),可以通过。
最后还有一点:不要忘记开 long long!