【模板】LCA(欧拉序+RMQ)

本文介绍了在信息学竞赛中利用欧拉序和ST表求解最近公共祖先(LCA)的方法。通过将LCA问题转化为RMQ问题,实现了预处理复杂度O(n+nlogn)和每次询问复杂度O(1)的在线算法。详细解释了欧拉序的概念,并通过实例展示了如何找到LCA。
摘要由CSDN通过智能技术生成

完整部分点这里

平常在信息学竞赛中求LCA一般有三种办法:

  • 倍增法求解,预处理复杂度是 O ( n log ⁡ n ) O(n\log n) O(nlogn) ,每次询问的复杂度是 O ( log ⁡ n ) O(\log n) O(logn), 属于在线解法。
  • 利用欧拉序转化为RMQ问题,用 ST表 求解RMQ问题,预处理复杂度 O ( n + n log ⁡ n ) O(n + n \log n) O(n+nlogn) ,每次询问的复杂度为 O ( 1 ) O(1) O(1), 也是在线算法。
  • 采用Tarjan算法求解,复杂度 O ( α ( n ) + Q ) O(\alpha(n) + Q) O(α(n)+Q) ,属于离线算法。

上述三种算法都比较常用,这篇文章主要介绍第二种解法。


先介绍一下欧拉序:
对有根树T进行深度优先遍历,无论是递归还是回溯,每次到达一个节点就把编号记录下来,得到一个长度为 2 N − 1 2N - 1 2N1 的序列,成为树 T 的欧拉序列F。

如图1(Inkscape手画,略丑轻喷~):

[外链图片转存失败(img-bLDJAzZw-1562835893221)(https://s1.ax2x.com/2018/08/05/55YtmN.png)]

图   1 − 有 根 树 T 图 \ 1 - 有根树T  1

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值