倍增求LCA
(1)树上倍增法 预处理
设f[x,k]表示x的2^k辈祖先,即从x向根节点走2^k步到达的节点。特别地,若该节点不存在,则令f[x,k]=0。f[x,0]就是x的父节点。可以得出f[x][k]=f[f[x][k-1]][k-1]。
我们可以对树进行遍历,由此得到f[x,0],再计算f数组所有值。
以上部分是预处理,时间复杂度为O(nlogn)。之后可以多次对不同的x,y计算LCA,每次询问的时间复杂度为O(logn)。
【代码实现】 预处理 void dfs(int u,int father) { Dep[u]=Dep[father]+1; for(int i=0;i<=19;i++) { if(!f[u][i)break; else f[u][i+1]=f[f[u][i]][i]; } for(int e=first[u],v; v=go[e],e; e=