学长讲的时候敲的LCA(倍增)代码 然后注释了一点点
#pragma GCC optimize(2) //O2优化
// 倍增LCA
//#include<bits/stdc++.h>
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
const int maxn = 1e4+10;
long long bit[maxn];
int depth[maxn];//结点i的深度
int f[maxn][30];//结点i的第2^j个祖先结点
vector<int> G[maxn];//图的邻接表表示
void init(){//二进制
bit[0] = 1;
for(int i = 1;i <= 29;i ++)
bit[i] = (bit[i-1]<<1);
}
void dfs(int u,int par){
depth[u] = depth[par] + 1;
f[u][0] = par;//父节点
for(int i = 1;i <= 29;i ++)
f[u][i] = f[f[u][i-1]][i-1];//i的第2^j个祖先 == i的第2^(j-1)个祖先的第2^(j-1)个祖先 (递推)
for(int i = 0;i < (int)G[u].size();i ++){//u相连的子结点
int v = G[u][i];
if(v == par) continue;
dfs(v,u);
}
}
int lca(int a,int b){
if(depth[a] < depth[b]) swap(a,b);
int dif = depth[a] - depth[b];//深度差
for(int i = 29;i >= 0;i --){//更新结点更新深度差
if(dif >= bit[i]){
a = f[a][i];
dif -= bit[i];
}
}
if(a == b) return a;
// for(int i = lg[depth[a]-1];i >= 0;i --) 2^30 int 最大值
for(int i = 29;i >= 0;i --){
//若f[a][i] != f[b][i] 那么他俩必定还在公共祖先的子树里面 ,然后在深度可查找范围,不断更新a,b
if(depth[a] >= bit[i] && f[a][i] != f[b][i]){
a = f[a][i];
b = f[b][i];
}
}
return f[a][0];
}
int main()
{
return 0;
}