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]异象石

原文地址:https://www.cnblogs.com/mrclr/p/13764166.html