求调 样例不过
查看原帖
求调 样例不过
1071907
lizihangrq楼主2025/2/7 09:42
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<vector>
#include<stack>
#include<map>
#include<set>
#include<ctime>
#include<cstdlib>
#define LL long long
//#include<cmath>
using namespace std;
const int constant=500005;
int n,m,root,f[constant][100],deep[constant],vis[constant]; 
vector <int> v[constant];
void dfs(int x){
	for(int i=0;i<v[x].size();i++){
		int s=v[x][i];
		if(vis[s]==0){
			vis[s]=1;
			deep[s]=1+deep[x];
			dfs(s);
		}
	}
	return ;
}
void _(){
	for(int i=1;i<=21;i++){
		for(int j=1;j<=n;j++){
			f[j][i]=f[f[j][i-1]][i-1];
		}
	}
	return ;
}
int LCA(int x,int y){
	if(deep[x]<deep[y]) swap(x,y);
	for(int i=20;i>=0;i--){
		if(deep[f[x][i]]>=deep[y]) x=deep[f[x][i]];
	}
	if(x==y) return x;
	for(int i=20;i>=0;i--){
		if(f[x][i]!=f[y][i]){
			x=f[x][i];
			y=f[y][i];
		}
	}
	return f[x][0]; 
}
int main(){
	scanf("%d%d%d",&n,&m,&root);
	for(int i=1;i<n;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		v[x].push_back(y);
	}
	
	dfs(root);
	_();
	for(int i=1;i<=n;i++){
		cerr<<deep[i]<<" ";
	}
	cerr<<"\n";
	while(m--){
		int a,b;
		scanf("%d%d",&a,&b);
		printf("%dsss\n",LCA(a,b));
	}
	return 0;
}
2025/2/7 09:42
加载中...