P11642 【MX-X8-T1】「TAOI-3」幸运草

Posted on 2025-04-18 23:17  K_J_M  阅读(7)  评论(0)    收藏  举报

题目描述

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\) 的最大值,然后相加取最大值即可。

Ac Code