求助一手为啥30
查看原帖
求助一手为啥30
354271
jokerd_tcl楼主2024/10/8 11:25

都调崩了

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=2e6+7;
int nxt[maxn],head[maxn],to[maxn],idx,depth[maxn],fa[maxn][21],lg[maxn];
void add(int u,int v){
	to[++idx]=v;
	nxt[idx]=head[u];
	head[u]=idx;
}
void dfs(int now,int fath){
	depth[now]=depth[fath]+1;
	fa[now][0]=fath;
	for(int i=1;i<=20;++i){
		fa[now][i]=fa[fa[now][i-1]][i-1];
	}
	for(int i=head[now];i;i=nxt[i]){
		if(to[i]!=fath)dfs(to[i],now);
	}
}
int lca(int x,int y){
	if(depth[x]<depth[y])swap(x,y);
	while(depth[x]>depth[y]){
		x=fa[x][lg[depth[x]-depth[y]]-1];
	}
	if(x==y){
		return x;
	}
	for(int k=lg[depth[x]]-1;k>=0;--k){
		if(fa[x][k]!=fa[y][k])x=fa[x][k],y=fa[y][k];
	}
	return fa[x][0];
}
int main(){
	int n,q,s;
	cin>>n>>q>>s;
	for(int i=1;i<=n;++i)lg[i]=lg[i-1]+(1<<lg[i-1]==1);
	for(int i=1;i<=n-1;++i){
		int a,b;
		cin>>a>>b;
		add(a,b);
		add(b,a);
	}
	dfs(s,0);
	while(q--){
		int x,y;
		cin>>x>>y;
		cout<<lca(x,y)<<endl;
	}
	return 0;
}
2024/10/8 11:25
加载中...