题解:P5101 [JOI 2017 Final] 绳 / Rope
题目关键在于证明:无论怎样折来折去,最后留下来的两根线只能按照 \((1,2),(3,4),\dots\) 或 \((2,3),(4,5),\dots\) 这两种配对方案出现。折叠相当于对区间做翻转并截去一段,端点的相对次序保持奇偶性不变,因此所有合法折叠序列的极限形态只能是上述两套邻接配对。我们分别在这两种配对上独立求解,再取较小者即为答案。
把每一对并成一段,整根绳子最终被分成 \(\lfloor N/2\rfloor\) 段,记颜色出现次数为 \(f_c\)。设目标颜色为 \(c\),最终必须保证左右两束中至少有一束被染成颜色 \(c\)。如果先把整根绳子都刷成 \(c\),费用是 \(N-f_c\);随后若选择另一束颜色为 \(y\ne c\),可以在不含 \(c\) 的段内挽回部分费用:若一段两端都是 \(y\) 可节省 \(2\),若为 \((y,z)\) 则节省 \(1\)。设 \(p_{c,y}\) 为在当前配对中出现 \((c,y)\) 或 \((y,c)\) 的段数,那么省下的总费用是 \(f_y-p_{c,y}\)。于是最小代价公式为
\[\operatorname{Ans}(c)=N-f_c-\max_{y\ne c}(f_y-p_{c,y})
\]
实现时先扫描统计 \(f_c\),再按配对遍历所有段,用哈希表累计不同色段次数并记录每种颜色的度数。接着重建稀疏图:同色段无边,异色段 \((a,b)\) 的权即为出现次数。把颜色编号按 \(f_c\) 降序排成数组,再对每个 \(c\) 遍历邻接表更新候选值,同时顺序扫降序数组找到第一个既非 \(c\) 又与 \(c\) 无边的颜色获得 \(f_y\)。
时间复杂度 \(O(N+M\log M)\)。

浙公网安备 33010602011771号