OI 笔记版——LCA

发布于 2024-07-23  528 次阅读


  • 朴素思路
    让深度 dep 较大的那个节点先向上跳,直至 dep 相同,然后逐层上寻

  • 朴素思路优化
    利用二分的思想,一次先跳较远的距离

  • 倍增算法
    预处理 fa_{x,i} 代表节点 x 的第 2^i 个祖先。
    fa_{x,i} 可以通过ST表的思想来求得
    fa[x][0]=f;fa[x][i]=fa[fa[x][i-1]][i-1]
    对于倍增本身,先让 x,y 跳到同一个深度,然后将 x,y 一起往上跳,从多到少,如果某一次跳跃使得跳到的节点是同一个,那么就试着跳 i 较小的节点,循环往复直到 fa[x][i] != fa[y][i] 此时的公共祖先就是 f[fa[x][i]]
    时间复杂度 O(nlogn)+O(logn)

OI 笔记版——LCA

  • Tarjan
届ける言葉を今は育ててる
最后更新于 2024-07-23