算法介绍
对进行(与同阶)次的树上询问问题,每次选个点(与同阶),每次对整棵树进行计算复杂度是的。但是可以建一颗虚树,只包含当前询问的个点和其他一些点(比如LCA),这样次询问总的复杂度就是。
建树方法:把当前询问的个点(下称关键点)按dfs序排序,用栈维护现在经过的链。先把根节点放进去,按顺序添加关键点,设栈顶节点为,次栈顶节点为,。
- ,说明在当前链上,直接加进去就行;
- ,说明没有被维护到当前链上,那么在虚树上连一条边,把弹出,压入,就维护好了新的链。
- ,说明在当前链上,仍然连边弹出,压入。
另一种方法是按dfs序排序,加入相邻两点的LCA后再排序,节点的父亲就是节点与前驱的LCA。