P5101 [JOI 2017 Final] 绳
题意
给出 \(a_1,\ldots,a_n\)。每次可以首尾折叠一个偶数回文串,求最终折成长度为 \(2\) 且有一个颜色是 \(c\in\{1,\ldots,M\}\) 的改颜色的最小代价。
思路
考虑一开始染颜色怎么染。发现对于除了首尾以外的奇数连续段,那么它是无法减少长度的。然后需要观察到结论:
能够拼成两个的充要条件是除了首尾两段以外,其它所有连续段长度为偶数。且颜色个数最多为 \(2\)。
对于充分性,可以考虑先将最后一段搞成 \(1\)。然后对于倒数第二段中线翻折,那么倒数第二段就变成了最后一段,重复即可。
对于必要性,如果对于中间的奇数段,那么它的两端都是异色的,所以永远无法被合并到首尾来消掉。
那么枚举第一段出现位置是首还是第二个位置。考虑一个偶数的连续段可以拆成若干个长度为 \(2\) 的段。那么考虑当前的颜色 \(c\)。则如果两个颜色都是 \(c\) 那么直接过,否则如果一个是 \(c\) 则将另一个也改成 \(c\) 即可。否则求其它剩余颜色个数最多的是哪个即可。
那么,我们假设对于颜色 \(c\) 总共出现了 \(N_c\) 次,设当前长为 \(2\) 的段两个颜色 \(c_1,c_2\) 总共出现了 \(f_{c_1,c_2}\) 次,则相当于要求:
\[n-N_c+\min_{i\neq c}(f_{i,c}-N_i)
\]
\[=n-N_c-\max_{i\neq c}(-f_{i,c}+N_i)
\]
那么可以认为,对于所有段中有 \(c\) 的点,假定为 \((c,p)\) 且 \(p\neq i\),我们认为将 \(N_p\) 减少 \(1\) 然后维护一下 \(\max_{i\neq c}(N_i)\) 即可。
然后因为 \(\sum N_i=n\) 故复杂度是 \(O(n+m)\) 的。

浙公网安备 33010602011771号