倍增LCA RE 30pts 求条。
查看原帖
倍增LCA RE 30pts 求条。
1207677
MassPoint楼主2025/2/1 17:25

Rt.

#include<bits/stdc++.h>
using namespace std;
int n,m,s;
vector <int> e[1001000];
int lg[51];
int deep[1001000];
int fa[1000100][51];
void dfs(int u,int fat,int de){
	fa[u][0]=fat,deep[u]=de;
	for(int i=1;i<=lg[deep[u]]+1;i++)
		fa[u][i]=fa[fa[u][i-1]][i-1];
	for(int i=0;i<e[u].size();i++)
		if(deep[e[u][i]]==0)	dfs(e[u][i],u,de+1);	
}
void init(){
	for(int i=1;i<=n;i++)	lg[i]=lg[i-1]+((1<<lg[i-1])==i);
	for(int i=0;i<=n;i++)	lg[i]--;
	dfs(s,0,1);
}
int lca(int x,int y){
	if(deep[x]<deep[y])	swap(x,y);
	while(deep[x]>deep[y])	x=fa[x][lg[deep[x]-deep[y]]];
	if(x==y)	return x;
	for(int i=lg[deep[x]];i>=0;i--)
		if(fa[x][i]!=fa[y][i])	x=fa[x][i],y=fa[y][i];
	return fa[x][0];
}
int main(){
	scanf("%d%d%d",&n,&m,&s);
	for(int i=1;i<n;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		e[x].push_back(y),e[y].push_back(x);
	}
	init();
	while(m--){
		int x,y;
		scanf("%d%d",&x,&y);
		printf("%d\n",lca(x,y));
	}
	return 0;
}
2025/2/1 17:25
加载中...