题目描述
Anzu 有一个正整数数列 \(a_1, \ldots, a_n\) 和一个整数 \(x\)。她可以进行至多一次操作,选择一对正整数 \(1 \le l \le r \le n\),然后对于所有 \(l \le i \le r\) 的正整数 \(i\) 让 \(a_i\) 变成 \(x\)。现在她想要知道,在这之后,数列里所有数的和最大是多少。
Solution
对于前 \(%50\) 的数据直接暴力即可,下面来说正解。
我们很容易想到一个贪心思路,就是将数列中连续的一段不超过 \(x\) 的数换成 \(x\)。但是注意这一组数据:
x=3
1 1 1 6 1 1 1
如果我们换成
3 3 3 6 1 1 1
和为 \(18\)。但如果换成
3 3 3 3 3 3 3
和为 \(21\),大于 \(18\)。因此我们不能贪心的只将不超过 \(x\) 的换成 \(x\),还应该跨越一些超过 \(x\) 的,将它们换成 \(x\) 以使得和更大。
具体操作如下:
我们记录前缀和 \(f_i\) 表示前 \(i\) 个数的和,假设我们将 \([l,r]\) 区间换成 \(x\),那么我们的增量为 \(Δ=(r-l+1)\times x-f_r+f_{l-1}\),我们展开并且使得 \(l,r\) 参数放一起,则变成 \(rx-f_r+f_{l-1}-(l-1)x\)。为什么这样操作呢?因为将参数放一起可以更好维护信息(执行到某步时至于当前参数有关)。那么我们可以枚举 \(i\),顺便记录此前 \(f_j-jx\) 的最大值,然后相加取最大值即可。
浙公网安备 33010602011771号