样例不过,悬关求调
查看原帖
样例不过,悬关求调
867511
Jason0322楼主2025/2/8 12:20
#include<bits/stdc++.h>
# define int long long
using namespace std;
const int maxn=5e5+10;
int n,m,t,tot;
int deep[maxn],p[maxn][22];
struct node{
	int nxt,to;
}e[maxn*2];
int head[maxn];
void add(int u,int v){
	e[++tot].nxt=head[u];
	e[tot].to=v;
	head[u]=tot;
}
void dfs(int u){
	for(int i=head[u];~i;i=e[i].nxt){
		int v=e[i].to;
		if(!deep[v]){
			deep[v]=deep[u]+1;
			p[v][0]=u;
			dfs(v);
		}
	}
}
void init(){
	for(int j=1;(1<<j)<=n;j++){
		for(int i=1;i<=n;i++){
			p[i][j]=p[p[i][j-1]][j-1];
		}
	}
}
int lca(int x,int y){
	if(deep[x]<deep[y]){
		swap(x,y);
	}
	int z;
	for(z=0;(1<<z)<=deep[x];z++);
	z--;
	for(int i=z;i>=0;i--){
		if(deep[x]-(1<<i)>=deep[y]){
			x=p[x][i];
		}
	}
	if(x==y){
		return x;
	}
	for(int i=z;i>=0;i--){
		if(p[x][i]!=-1&&p[x][i]!=p[y][i]){
			x=p[x][i];
			y=p[y][i];
		}
	}
	return p[x][0];
}
signed main(){
	memset(head,-1,sizeof(head));
	cin>>n>>m>>t;
	for(int i=1;i<n;i++){
		int u,v;
		cin>>u>>v;
		add(u,v);
		add(v,u);
	}
	dfs(t);
	for(int i=1;i<=m;i++){
		int x,y;
		cin>>x>>y;
		cout<<lca(x,y)<<endl;
	}
    return 0;
}
2025/2/8 12:20
加载中...