、

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)\) 的。

posted @ 2026-09-24 14:44  tanghg  阅读(4)  评论(0)    收藏  举报