倍增,样例没过,求调
查看原帖
倍增,样例没过,求调
1353330
K_J_M楼主2024/7/6 20:56
#include<bits/stdc++.h>
using namespace std;
const int N = 5e5+10;
int n,m,s,x,y,a,b;
vector<int>e[N];
int f[N][30],dep[N],lg[N];
void dfs(int now,int fath){
	dep[now]=dep[fath]+1;
	f[now][0]=fath;
	for(int i=1;i<=lg[dep[now]];i++) f[now][i]=f[f[now][i-1]][i-1];
	for(int i=0;i<e[now].size();i++){
		if(e[now][i]!=fath){
			dfs(e[now][i],now);
		}
	}
}
int LCA(int a,int b){
	if(dep[a]<dep[b]) swap(a,b);//默认dep[a]>dep[b] 
	while(dep[a]>dep[b]){
		a=f[a][lg[dep[a]-dep[b]]];//跳到同一高度 
	}
	if(a==b) return a;//如果ok,则直接输出 
	for(int k=lg[dep[a]];k>=0;k--){
		if(f[a][k]!=f[b][k]){//一直跳到LCA下面一个 
			a=f[a][k],b=f[b][k]; 
		}
	}
	return f[a][0];//上面一个就是LCA 
}
int main(){
	cin>>n>>m>>s;
	for(int i=1;i<n;i++){
		cin>>x>>y;
		e[x].push_back(y);
		e[y].push_back(x);//连边 
	}
	for(int i=1;i<=n;i++){
		lg[i]=lg[i-1]+(1<<(lg[i-1]+1)==i);//处理lg 
	}
	//lg1=0,lg2=1,lg3=1,lg4=2... 
	dfs(1,0);//处理f数组和dep数组 
	while(m--){
		cin>>a>>b;
		cout<<LCA(a,b)<<endl;
	}
	return 0;
}
2024/7/6 20:56
加载中...