题解:P5773 [JSOI2016] 轻重路径

· · 题解

非常优雅的一道题目。

题意简述:给出一个以 1 为根的树,多次询问。每次删掉一个叶子节点,求重儿子节点标号和。

先考虑一个显而易见的性质:假设其 u 所在的子树根为 rt(也就是说 u 所有的祖先都可以作为 rt)。由于 u 非重儿子,那么一定可以得到 siz_u\le \dfrac{siz_{rt}}2,如果不满足这个条件,那么 u 必然为重儿子。

当一个叶子节点 u 被删除后,被影响到是 u1 的这一条链。考虑上述性质,可能被影响到的 v 必然有 siz_v\le \dfrac{siz_{rt}}2。从根节点往下跳,对于 首个 满足该性质的点 v 进行判断。那么剩下可能被修改的只能在 v\to u 的路径中。而子树 v 大小至少从子树 rt 减半,因此每一次操作最多会影响到 \mathcal O(\log n) 个节点。

我们只需维护每个子树的大小即可。这是经典的区间修改,单点查询问题,可以用树状数组维护。对于「往下跳」操作,可以用倍增从删除的叶子节点 u 往上跳,与倍增 LCA 是类似的。

假设 nq 同阶,时间复杂度为 \mathcal O(n\log ^3n)