题解:P12391 「RiOI-6」帝国少女
\(\text{Upd 2025/5/4}\):修正了一些笔误。
\(\text{Upd 2025/12/12}\):修正了一些笔误。
题意
对于值域为 \([1,m]\) 的序列 \(b\),定义其权值为执行以下操作的最小次数,使得 \(b\) 中任意相邻两数不同:
- 选定一个 \(b_i\),将其修改为 \([1,m]\) 中的任意一个整数。
求出 \(a\) 中所有子段的权值和。多测,\(1\leq n\leq\sum{n}\leq 2\times 10^5\),\(2\leq m\leq 10^9\)。
题解
可以想到将 \(a\) 划分成若干极长同色段,对每个同色段分开做。若 \(m>2\),可以从左往右遍历每个颜色段,设前一个颜色段的颜色为 \(c_1\),当前颜色段的颜色为 \(c_2\),我们总能选出 \(c_3\) 使得 \(c_3\neq c_1\land c_3\neq c_2\),然后在该段中隔位染成 \(c_3\)(若段长为偶数则从起点开始染,否则从起点后一位开始染)。这样我们就得到了最小代价 \(\sum\left\lfloor\frac{len}{2}\right\rfloor\)。
如何快速计算所有子区间的 \(\sum\left\lfloor\frac{len}{2}\right\rfloor\) 之和?考虑枚举右端点 \(r=1\sim n\),每次 \(r\gets r+1\) 时,维护所有以 \(r\) 为右端点的区间的贡献和 \(s\)。这个不难算,考虑 \(r\) 所在的颜色段 \([pre_r,r]\):
- 对于 \(1\leq l<pre_r\) 的区间 \([l,r]\),从 \([l,r-1]\) 变成 \([l,r]\) 增加的贡献,就是从 \(\left\lfloor\frac{r-pre_r}{2}\right\rfloor\) 变成 \(\left\lfloor\frac{r-pre_r+1}{2}\right\rfloor\) 增加的贡献。因此若 \(r-pre_r+1\) 为偶数,令 \(s\gets s+pre_r-1\) 即可。
- 对于 \(pre_r\leq l\leq r\) 的区间 \([l,r]\),增加的贡献就是从 \(\sum\limits_{i=0}^{r-pre_r}\left\lfloor\frac{i}{2}\right\rfloor\) 变成 \(\sum\limits_{i=0}^{r-pre_r}\left\lfloor\frac{i+1}{2}\right\rfloor\) 增加的贡献。因此令 \(s\leftarrow s+\left\lfloor\frac{r-pre_r+1}{2}\right\rfloor\) 即可。
这部分复杂度为 \(\mathcal{O}(n)\)。
考虑 \(m=2\) 怎么做。显然序列会被修改成 \(1,2\) 交错的形式。套路地将奇数位翻转,则一个子段的权值就是子段内 \(1,2\) 数量的最小值。考虑拆 \(\min\),即
显然 \(\sum c_1+c_2\) 就是所有区间的长度和,也就是 \(\sum\limits_{i=1}^n\dfrac{i(i+1)}{2}\)。而对于 \(\sum |c_1-c_2|\),容易想到将 \(2\) 替换成 \(-1\),就变成了所有子段和的绝对值之和,求出前缀和,式子就是
对 \(pre\) 排序后前缀和统计答案即可。时间复杂度 \(\mathcal{O}(n\log{n})\),瓶颈在于排序,可以桶排做到线性。

浙公网安备 33010602011771号