倍增70分求调
查看原帖
倍增70分求调
524160
Lin_Master楼主2023/7/11 11:23
#include<iostream>
#include<vector>
#include<cstdio>
#define int long long
using namespace std;
int n,m,s;
vector<int> adj[500005];
int dep[500005];
int fa[500000][31];
//inline int read(){
//	int x=0,y=1;
//	char c=getchar();
//	while(c<'0'||c>'9'){
//		if(c=='-'){
//			y=-1;
//		}
//		c=getchar();
//	}
//	while(c>='0'&&c<='9'){
//		x+=x*10+c-'0';
//		c=getchar();
//	}
//	return x*y;
//}
void dfs(int root, int f, int d){
	dep[root]=d;
	fa[root][0]=f;
	for(int i=0;i<adj[root].size();++i){
		int k=adj[root][i];
		if(k==f){
			continue;
		}
		dfs(k,root,d+1);
	}
}
int jump (int x, int d) {
	for (int i = 0; i <= 20; ++i) {
		if ((1<<i)&d) {
			x=fa[x][i];
		}
	}
	return x;
}
int lca(int x, int y){
	if (dep[x]<dep[y]) {
		swap(x, y);
	}
	int t=dep[x] - dep[y];
	int xx=jump(x,t);
	if(xx==y){
		return y;
	}
	for(int i=20;i>=0;--i){
		int t1=fa[xx][i];
		int t2=fa[y][i];
		if(t1!=t2){
			xx=fa[xx][i];
			y=fa[y][i];
		}
	}
	return fa[y][0];
}
signed main(){
	cin >> n >> m >> s;
	for(int i=1;i<n;++i){
		int x,y;
		cin>>x>>y;
		adj[x].push_back(y);
		adj[y].push_back(x);
	}
	dfs(s,0,0);
	for(int i=1;i<=20;++i){
		for(int j=1;j<=n;++j){
			fa[j][i]=fa[fa[j][i-1]][i-1];
		}
	}
	while(m--){
		int x,y;
		cin>>x>>y;
		cout<<lca(x,y)<<endl;
	}
	return 0;
}
2023/7/11 11:23
加载中...