求调
查看原帖
求调
1028839
nytyq楼主2025/1/11 22:03
#include<bits/stdc++.h>

using namespace std;
const int N=5e5+10;

int h[N],e[N],ne[N],idx;

void add(int a,int b){
	e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}

int n,m,s;

int pos[N],val[N<<1][20];
int cnt=0;
int euler[N<<1];

int sum[N];

int dep[N];

void dfs(int u,int fa){
	dep[u]=dep[fa]+1;
	pos[u]=cnt+1;
	for(int i=h[u];i;i=ne[i]){
		int v=e[i];
		if(v==fa) continue;
		euler[++cnt]=u;
		dfs(v,u);
	}
	euler[++cnt]=u;
}

int fa[N][20];

int Log[N];

int query(int l,int r){
	int s=r-l+1,k=Log[s];
	return min(dep[fa[r-(1<<k)+1][k]],dep[fa[l][k]]);
}

int get(int u,int v){
	int l=pos[u],r=pos[v];
	if(l>r) swap(l,r);
	return query(l,r);
}

int main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>m>>s;
	for(int i=1;i<=n;i++){
		int u,v;
		cin>>u>>v;
		add(u,v),add(v,u);
	}
	
	dfs(s,0);
	
	Log[0]=-1;
	for(int i=1;i<N;i++) Log[i]=Log[i>>1]+1;
	
	for(int i=1;i<=cnt;i++){
		fa[i][0]=euler[i];
	}
	
	for(int j=1;(1<<j)<=cnt;j++){
		for(int i=1;i+(1<<(j-1))+1<=cnt;i++){
			if(dep[fa[i][j-1]]<dep[fa[i+(1<<(j-1))+1][j-1]]) fa[i][j]=fa[i][j-1];
			else fa[i][j]=fa[i+(1<<(j-1))+1][j-1]; 
		} 
	}
	
	for(int i=1;i<=m;i++){
		int l,r;cin>>l>>r;
		int LCA=get(l,r);
		cout<<LCA<<endl;
	}

	return 0;
}

2025/1/11 22:03
加载中...