树上倍增:链上信息维护
倍增:把链进行二进制分解,把每个长度为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);