Description
题目链接:Codeforces 1107G
Vasya 打算举办一场比赛,他有 $n$ 个题目可供选择,标号为 $1$ 到 $n$。第 $i$ 道题的难度为 $d_i$,保证题目的难度递增,且两两不同。添加第 $i$ 道题需要向其作者支付 $c_i$ 的钱,每道题会使 Vasya 获得 $a$ 的钱。
他选择的题目一定是一个连续的子段。
所以比赛的总收益计算如下:
- 如果 Vasya 添加了第 $i$ 道题目,那么他需要支付 $c_i$ 的钱。
- 对于比赛中的每道题目,Vasya 会得到 $a$ 的钱。
- 令 $\text{gap}(l,r)=\max_{l\le i<r} (d_{i+1}-d_i)^2$。如果 Vasya 将第 $l$ 到第 $r$ 道题目添加到了比赛中,他还需要支付 $\text{gap}(l,r)$ 的钱。特殊的,当 $l=r$ 时,$\text{gap}(l,r)=0$。
请你计算 Vasya 举办这场比赛最多能获得的收益。
数据范围:$1\le n\le 3\times 10^5$,$1\le a,d_i,c_i\le 10^9$,$d_i<d_{i+1}$
Solution
首先我们将所求用数学式子表示出来:
我们先考虑一个简单版本:没有 $d_i$ 的限制。那么本题就变成了一个裸的最大子段和。
接下来进一步推广:如果 $\max_{i\le i<r}(d_{i+1}-d_i)^2$ 的值确定了,那么依旧是一个最大子段和的问题。
至此,我们已经可以发现:只要确定每个 $(d_{i+1}-d_i)^2$ 的贡献区间范围,那么就转化成了简单问题了(最大子段和可以通过线段树维护)。
所以,现在的问题就是如何求 $d_{i+1}-d_i$ 的贡献范围。记 $dif_i=d_{i+1}-d_i(1\le i<n)$,那么就是求一段区间 $[l,r]$ 满足 $dif_i$ 是区间内的最大值。这个模型可以维护一个递减的单调栈解决。注意求出的区间 $[l,r]$ 在原序列中应该是 $[l,r+1]$(因为 $dif_i=d_{i+1}-d_i$)。
注意 $l=r$ 的情况:此时不存在 $dif_i$,因此要特殊处理!
时间复杂度:$O(n\log n)$
Code
1 |
|