LCA(最近公共祖先)
首先遍历一次预处理
void dfs(int now,int fath){
fa[now][0] = fath;dep[now] = dep[fath] + 1;
for(int i = 1;i <= lg[dep[now]];i ++){
fa[now][i] = fa[fa[now][i - 1]][i - 1];
}
for(int i = head[now];i;i = e[i].next){
if(e[i].to != fath) dfs(e[i].to,now);
}
}
然后LCA
int LCA(int x,int y){
if(dep[x] < dep[y]) sawp(x,y);
while(dep[x] > dep[y]) x = fa[x][lg[dep[x] - dep[y]] - 1];
if(x == y) return x;
for(int k = lg[dep[x]] - 1;k >= 0;k --){
if(fa[x][k] != fa[y][k]) x = fa[x][k],y = fa[y][k];
}
return fa[x][0];
}
lg可以有常数优化
for(int i = 1;i <= n;i ++)
lg[i] = lg[i - 1] + (1 << lg[i - 1] == i);
静态RMQ(ST表查询)
预处理
for(int j = 1;(1 << j) <= n;j ++){
for(int i = 1;i + (1 << j) - 1 <= n;i ++){
f[i][j] = max(f[i][j - 1],f[i + (1 << (j - 1))][j - 1]);
//f[i][j] = min(f[i][j - 1],f[i + (1 << j)][j - 1]);
}
}
查询
int query(int l,int r){
int k = log2(r - l + 1);
return max(f[l][k],f[r - (1 << k) + 1][k]);
//return min(f[l][k],f[r - (1 << k) + 1][k]);
}