LCA知识补充及相关习题

知识补充

在求lca的时候,除了常规的倍增、RMQ、树剖以外,还有一种改良的倍增算法,效率是原来的一倍。


具体步骤是在dfs预处理倍增数组的时候同时维护两个时间戳\(Tin\)\(Tout\),分别代表dfs时进入该子树和离开该子树的时刻。
这样如果点\(u\)是点\(v\)的祖先,必然满足\(Tin(u) < Tin(v), Tout(v) < Tout(u)\)。所以我们可以\(O(1)\)判断两个点的祖先关系。
基于这个思想,求\(x\)\(y\)的lca,我们只用判断当前深度小的点往上跳\(2 ^k\)步后是否为\(y\)的祖先,如果不是就跳。这样最后\(x\)的父亲节点就是lca了。
时间复杂度虽然是\(O(nlogn)\),但是实际运行时间不到原来算法的\(\frac{1}{2}\)


接下来说一些有意思的习题。
POJ3417 Network

[AHOI2008]聚会

Rikka with Intersections of Paths

[SDOI2015]异象石

posted @ 2020-10-03 14:28  mrclr  阅读(185)  评论(0编辑  收藏  举报