防止意外爆零 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];
	}
}
posted @ 2026-08-30 22:54  IterateRabbitwky  阅读(14)  评论(0)    收藏  举报