P12391 「RiOI-6」帝国少女

P12391\(\mathbf{} \begin{Bmatrix} \frac{{\Large LUOGU_P12391} }{{\color{Red}\Large Solution} }\mathbf{} {No.36} \end{Bmatrix}\times{}\) NeeDna

题意

给出一个序列,其中每个数不超过 \(m\),问所有子区间的修改成相邻数字不相同的最小代价的总和。

题解

我们先观察一下样例 \(3\),发现有很多连续段,我们思考以连续段为基础进行计算。先思考 \(m>2\) 的情况。

假设一个连续段的长度为 \(x\) 我们会发现把这个连续段修改成合法的代价是 $\left \lfloor \frac{x}{2} \right \rfloor $。接下来我们看这个代价会被计算多少次。显然有下列 \(4\) 中情况。

  • 作为一段前缀出现。
  • 作为一段后缀出现。
  • 完整出现。
  • 自己把子段包含住。

\(4\) 种统计都不难想反正。接下来我们考虑 \(m=2\) 的情况。首先我们想一下最后的序列,一定是 \(1212\cdots\) 或者 \(2121\cdots\) 这样的吧。那我们发现了一个对应关系:

奇数位对应 \(1\) ,偶数位对应 \(2\) ,或者相反。这样对应的两种的最小值就是最小修改数。

我们接下来把偶数位 \(1\to 2,2\to 1\) 这样翻转之后我们要求的就是序列中 \(1\)\(2\) 的最小出现次数。我们记这两个出现次数为 \(x_1,x_2\)。我们有一下式子:

\[\min(x_1,x_2)=\frac{x_1+x_2-|x_1-x_2|}2 \]

接下来我们把序列中的 \(2\) 换成 \(-1\) ,再对这个序列做一个前缀和。那么对于以个序列 \(S\) 发现这个式子可以替换成这个形式:

\[ans_s=\frac{len_s-|sum_r-sum_{l-1}|}2 \]

\(len\) 是好处理的,看一下绝对值怎么处理,方法是这样的:

  • 我们先对前缀和的每一位排序
  • 计算每一位对于之前所有位数之差。形式化的,我们计算\(\sum^{n}_{i=2}\sum^{i-1}_{j=1}sum_i-sum_j\)
  • 上面式子可以表达为\(\sum^{n}_{i=1}sum_i\times(2i-1-n)\)

这个东西按照顺序是很好处理的,然后我们就做完了。

posted @ 2025-08-08 14:06  NeeDna  阅读(12)  评论(0)    收藏  举报