loj#P2079. 「JSOI2016」轻重路径

「JSOI2016」轻重路径

题目描述

JYY 最近学习了一种处理树形结构的高级技巧,叫「轻重路径剖分」。这种技术会将树中的边划分成轻边和重边。相连的重边会形成一些树上相离的路径。「轻重路径剖分」可以使得从树上任意一点走到根,都至多只会经过 O(logN)\mathcal{O} (\log N) 条不同的重路径。

如果你不了解轻重路径剖分,JYY 在这里简单介绍一下:对于一棵有根树中的任意一个点 uu,我们用 size(u)\text{size}(u) 表示其为根的子树中的点的数量。对于 uu 的所有孩子中,我们选出 size\text{size} 值最大的孩子 vv,并将边 (u,v)(u,v) 设置成重边,uu 和其他孩子之间的边我们均设置为轻边。

为了简化问题,这里 JYY 仅考虑一棵 NN 个点的有根二叉树。这 NN 个点由 11NN 编号。并且如果 uu 存在两个 size\text{size} 值一样的孩子,则我们默认 uu 和其左孩子的连边为重边。

现在 JYY 希望执行额外 QQ 次删点操作,每次 JYY 会随机删掉一个当前二叉树的叶子节点,而你则需要动态的维护这棵树的轻重路径剖分。

为了方便输出,你只需要在每次操作后输出所有重边指向的点的权值和即可。

如果删除一个点之后,存在一个点 uu 拥有两个 size\text{size} 值一样的孩子,则我们保持 uu 在该操作执行之前的重边划分。

输入格式

第一行包含一个整数 NN
接下来 NN 行,第 ii 行包含两个整数 Li,RiL_i,R_i,表示编号为 ii 的点的左孩子编号和右孩子编号,Li=0L_i=0表示点 ii 没有左孩子,Ri=0R_i=0 表示点 ii 没有右孩子;
N+2N+2 行包含一个整数 QQ,表示 JYY 进行的删点操作;
N+3N+3 行包含 QQ 个空格分开的正整数,表示 JYY 删去的叶子的编号。
输入数据保证每次删除操作均删除了一个叶子。

输出格式

输出 Q+1Q+1 行,每行包含一个整数,表示在轻重路径剖分中所有重边指向的点的编号的和。其中第一行对应初始的路径剖分,之后的 QQ 行对应进行了相应删点操作之后路径划分。

8
2 3
4 5
0 0
6 7
0 8
0 0
0 0
0 0
7
6 7 8 5 4 2 3
20
21
15
7
6
2
3
0

数据范围与提示

对于 30%30\% 的数据,满足 N1000N\le 1000
对于 50%50\% 的数据,满足 N5×104N\le 5\times 10^4
对于全部数据,满足 N2×105N\le 2\times 10^5