CF1930H Interactive Mex Tree
CF1930H Interactive Mex Tree
首先考虑怎么通过
设
- 进入
u 之前进入的红点; - 进入
u 之后,进入v 之前进入的橙点,去掉u\to v 这条链。等于从u dfs 到v 时,对路径上的每个点,在往v 的方向移动之前遍历的所有子树的并。 - 进入
v 之后进入的蓝点;
红点是 dfs 序的区间
注意此时只用到了一个排列,那么另一个排列就是用来解决这个问题的。与 dfs 相关的序列,除了 dfs 序(进栈序)以外还有出栈序,即离开结点的顺序。注意到所有橙点均在离开
对于
根据需要被覆盖的点在 dfs 序上形成区间的情况,得到以下五个部分:
- 进入
d 之前进入的红点。用 dfs 序的[1, \mathrm{dfn}_d - 1] 覆盖。 - 进入
d 之后,进入u 之前进入的橙点,并去掉d\to u 这条链。用出栈序的[1, \mathrm{dfe}_u - 1] 覆盖。 - 进入
u 之后,进入suc 之前进入的浅蓝点,其中suc 是d 在v 方向上的儿子。用 dfs 序的[\mathrm{dfn}_u + 1, \mathrm{dfn}_{suc} - 1] 覆盖。 - 进入
suc 之后,进入v 之前进入的深蓝点,并去掉d\to v 这条链。用出栈序的[\mathrm{dfe}_{pre} + 1, \mathrm{dfe}_v - 1] 覆盖,其中pre 是d 的suc 前一个儿子,图中pre = u 。 - 进入
v 之后进入的灰点。用 dfs 序的[\mathrm{dfn}_v + 1, n] 覆盖。
总共
时间复杂度