[CF671D] Roads in Yusland

对于每个子树,显然下端点不在子树内的链不会对子树内部的覆盖情况产生影响,所以我们将所有下段点在子树内的链构的集合的一个能够完全覆盖该子树的子集称作一种合法方案;将一种合法方案的下段点最靠上的链称作最浅链。

我们要对于每颗子树的每种可能的最浅链取值,维护权值最小的合法方案。

儿子转移向父亲的过程中,需要加入答案最小的以下段点为儿子的链为最浅链的方案。此时贪心地选择子树内维护的所有合法方案中答案最小者,加上该链贡献即可。

多个儿子合并时,如果某条链被钦定为父亲答案中的最浅链,除了该链下段点所在的儿子子树,其余儿子子树中贪心选择所有合法方案中最小值即可。如果其余子树中的方案选择使得该链最终不是最浅链,这样构造出来的错误方案一定不优于钦定真实的最浅链为最浅链构造出来的方案,所以无关紧要。

于是我们需要这样一种数据结构:能够快速求出集合中最小值,快速给集合权值整体加 $k$,合并若干集合。因此使用可并堆。

至于在转移过程中不能完全覆盖子树而变得不合法的方案,可以 lazy 地进行弹出。即使用到某个集合最小值时再判断其合法性,不合法则弹出。