题解: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\),即

\[\min(c_1,c_2)=\frac{c_1+c_2-|c_1-c_2|}{2} \]

显然 \(\sum c_1+c_2\) 就是所有区间的长度和,也就是 \(\sum\limits_{i=1}^n\dfrac{i(i+1)}{2}\)。而对于 \(\sum |c_1-c_2|\),容易想到将 \(2\) 替换成 \(-1\),就变成了所有子段和的绝对值之和,求出前缀和,式子就是

\[\sum_{i=1}^n\sum_{j=i}^n|pre_j-pre_{i-1}| \]

\(pre\) 排序后前缀和统计答案即可。时间复杂度 \(\mathcal{O}(n\log{n})\),瓶颈在于排序,可以桶排做到线性。

posted @ 2025-05-04 18:03  P2441M  阅读(21)  评论(0)    收藏  举报