给定一颗树,每条边$[L_i,R_i]$的人可以通过。每个人可以额外走$0/1$条不符合要求的边,询问每个人可以到达点的数量之和。
显然是线段树分治。但是维护并茶几毕竟麻烦。
- $k=0$ ,显然即是自己的联通块大小。
- $k=1$ ,显然即是自己的联通块大小$+$连接出去的联通块大小,显然不可能重新遍历一遍。 考虑这题用的是树,那么一个联通快一定有最高点和最低点。$ans=$ 自己联通块大小$+$最高点父亲联通快大小$+$ 最低点的儿子联通块大小。
- 维护最高点父亲,每次合并时合并最高点即可。
- 维护最低点的儿子联通块大小,初始化的时候就是儿子的数量,当维护最高点父亲,此时相对与最高点父亲所在联通快的最低点的儿子联通块大小,也变大了。
- 合并$x$,$y$时假设拥有最高点的联通块在$x$,那么此时的合并使得最低点的儿子联通块大小增加了$son_{sum}[find(y)]-siz[find(y)]$
代码
1 |
|