虚树
树上对于某几个特殊的点和其两两的 LCA 构成的树。
常用于解决关键点少或多次询问给定点集、答案与树除了关键点以外的形态无关的问题。
构建方法是:
维护栈,表示从根到虚树现在节点的路径,每次加入按如下流程操作:
如果目前的栈顶是加入点的祖先,直接入栈。否则设栈顶和点的 LCA 是 \(x\)。
如果栈顶不是祖先,不断弹栈,直到栈为空或栈顶是 \(x\) 的祖先。
然后如果 \(x\) 不在栈内,顺序插入 \(x\) 个待插入点即可。
最后清空栈。注意每次弹栈都要和栈顶连边。