LCA

本文介绍了树上倍增算法的基本原理及应用。通过将链进行二进制分解,求出不同长度链的信息并进行累加,实现快速查找最近公共祖先(LCA)。文章详细解释了如何预处理和利用倍增数组p[x][i]来加速查找过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

树上倍增:链上信息维护
倍增:把链进行二进制分解,把每个长度为2的i次方的链的信息求出来,然后再累加

原理:任何一个数都可被二进制分解
操作:
1.调到相同的深度
2.若已重合,则y是x的祖先
3.若没重合,则一起向上跳:
枚举i从s到0,2s为小于到根的最大距离

p[x][i]:x号点向上走2i步能到的点

预处理p[x][i]:p[x][i]=p[p[x][i-1][i-1],因为2* 2i-1=2i,即走两次i-1就到i了
根节点的深度是 1,从根节点往下,每层深度都 +1,叶节点和叶节点深度可能不一样

性质:
如果两条路相交,深度深的lca一定在浅的路径上
在这里插入图片描述
查看一个点在一个路径上:
满足该点到路径两端点的距离等于两端点的距离
距离用lca和深度

dis(u,v):
设lca(u,v)=x;
dis(u,v)=dep(u)-dep(x)+dep(v)-dep(x)=dep(v)+dep(u)-2*dep(x);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值