Loading

[51Nod 1558] 树中的配对

前言

这能不会, 这能不会, 这能不会???
做了一会之后, 感觉确实可以不会

思路

题意

带权树
求一组排列 pp 使得 dis(i,pi)max\textrm{dis} (i, p_i) \to \max

结论

一条边最多的经过次数就是其连接的两部分中较小的那一个

证明方法 \(1\)

调整法
首先点对初始化为 \(\{i, i\}\)
可以任意交换点对之间的第二个元素

对于一条边, 如果其两个部分中, 其中一个部分出现了点对两元素都在同一部分, 那么另外一个部分必然出现点对两元素都在同一部分, 交换这两个点对的第二个元素一定更优, 不难发现最终必然对于每条边都不存在可以交换的点对两元素都在同一部分, 因此这样最优

证明方法 \(2\)

构造法
发现点对 \(\{i, p_i\}, \{j, p_j\}\) 不交, 可以交换 \(p_i, p_j\) 使答案更大
不难发现任意两点对 \(\{i, p_i\}\) 有交

不难发现所有点对路径拥有公共点, 画图证明
pEJFWYq.png
任意不存在公共点的路径必然成环

考虑什么样的点可以作为公共点, 这样我们可以简单地通过

\[\begin{align*} \sum \textrm{dis}(i, p_i) &= \sum \Big(\textrm{dep}_i + \textrm{dep}_{p_i} - 2\textrm{dep}_{\textrm{LCA}(i, p_i)}\Big) \\ &= \boxed{2\sum \textrm{dep}_i} - 2\sum \textrm{dep}_{\textrm{LCA}(i, p_i)} \end{align*}\]

求出答案最值

不妨记这个点为 \(u\)
不难发现重心是 \(u\) 的一个好的选择

不难发现, 如果令 \(u\) 为重心, 把子树按照大小从大到小排序
那么从大小大的到大小小的处理, 每次贪心的用更大的子树连向自己, 这样一定可以构造出合法解

发现这样的解恰好可以使得答案满足性质

总结

树上常见的拆距离方式

调整法常用

posted @ 2025-03-04 19:08  Yorg  阅读(19)  评论(0)    收藏  举报