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\)。我们有一下式子:
接下来我们把序列中的 \(2\) 换成 \(-1\) ,再对这个序列做一个前缀和。那么对于以个序列 \(S\) 发现这个式子可以替换成这个形式:
\(len\) 是好处理的,看一下绝对值怎么处理,方法是这样的:
- 我们先对前缀和的每一位排序
 - 计算每一位对于之前所有位数之差。形式化的,我们计算\(\sum^{n}_{i=2}\sum^{i-1}_{j=1}sum_i-sum_j\)
 - 上面式子可以表达为\(\sum^{n}_{i=1}sum_i\times(2i-1-n)\)
 
这个东西按照顺序是很好处理的,然后我们就做完了。

                
            
        
浙公网安备 33010602011771号