防止意外爆零 2:倍增 LCA 的一点小坑
倍增预处理时处理每个节点的第 \(2^j\) 个祖先的循环放外层。不然会得到一屏 RE。
namespace lca{
int dep[N],dad[N][25];
void dfs(int now,int lst){
dep[now]=dep[lst]+1;
dad[now][0]=lst;
for(auto e:T[now]){
if(e!=lst){
dfs(e,now);
}
}
}
void ycl(){
for(int j=1;(1<<j)<=n;j++){//这里
for(int i=1;i<=n;i++){//这里
dad[i][j]=dad[dad[i][j-1]][j-1];
}
}
}
int work(int x,int y){
if(dep[x]<dep[y]){
swap(x,y);
}
while(dep[x]>dep[y]){
x=dad[x][__lg(dep[x]-dep[y])];
}
if(x==y) return x;
for(int i=__lg(dep[x]);i>=0;i--){
if(dad[x][i]!=dad[y][i]){
x=dad[x][i];
y=dad[y][i];
}
}
return dad[x][0];
}
}

浙公网安备 33010602011771号