hhh A 题读错题了,完全错解还过了 9 个样例。。。

B

一个都不删的情况:最优肯定是最长链放在最后不回溯

要删点: 注意到如果一个关键节被删,那它上面有一段的路不用走,具体的,就是止步于分支节点或者另一个关键点,而这个分支节点恰好是被删节点和其他关键节点最近公共祖先(下简称父亲)。

所以对关键点新建一棵树 GG,边权 valuval_u 就是关键点 u 到父亲的距离。利用递归栈的性质可以实现。

记总长 sumsum 就是完全走完的路线长度(所有关键点都不删,每走完一个关键点就回到根)。

如果删了一个 GG 的叶子 uu:

那 uu 到它父亲这条路不用走了,sumsum 减去 valuval_u。然后依旧把最长链留到最后不回溯,根据 sumsum 的定义,sumsum 把最长链多算了一次,要减去最长链的长度

另外最长链只有两种可能:原树最长链和原树非严格次长链

当然并不需要真的建这颗树,我们需要信息的有且仅有这个节点到父亲的边权是多少,直接维护 valival_i。

综上所述

答案是 sum−[u 在 G 中是叶子]∗valu−当前最长链的长度sum - [u \ 在 \ G \ 中是叶子] * val_u - 当前最长链的长度

0 条评论

目前还没有评论...