LCA转RMQ问题代码求调
查看原帖
LCA转RMQ问题代码求调
575363
revolutionary_oier楼主2023/10/20 15:06
#include<bits/stdc++.h>
#define int long long
using namespace std;

const int maxn=5e5+10;
int n,m,s,cnt,tot;
int head[maxn],dep[maxn],dfn[maxn],pos[maxn],lg[maxn<<1];
int st[maxn][30],rev[maxn][30];
struct node{
	int v,nxt;
}e[maxn<<1];
inline void add(int u,int v){
	e[++cnt].v=v;
	e[cnt].nxt=head[u];
	head[u]=cnt;
}
inline void input(){
	scanf("%lld%lld%lld",&n,&m,&s);
	for(register int i=1;i<n;i++){
		int u,v;
		scanf("%lld%lld",&u,&v);
		add(u,v);
		add(v,u);
	}
}
inline void dfs(int x,int f,int d){
	dfn[++tot]=x;
	dep[x]=d;
	pos[x]=tot;
	for(register int i=head[x];i;i=e[i].nxt){
		int v=e[i].v;
		if(!pos[v]){
			dfs(v,x,d+1);
			dfn[++tot]=x;
		}
	}
}
inline void ST(){
	for(register int i=2;i<=tot;i++)lg[i]=lg[i>>1]+1;
	for(register int i=1;i<=tot;i++)st[i][0]=dep[i],rev[i][0]=dfn[i];
	for(register int i=1;i<=lg[tot];i++){
		for(register int j=1;j+(1<<i)-1<=tot;j++){
			if(st[j][i-1]<st[j+(1<<(i-1))][i-1])st[j][i]=st[j][i-1],rev[j][i]=rev[j][i-1];
			else st[j][i]=st[j+(1<<(i-1))][i-1],rev[j][i]=rev[j+(1<<(i-1))][i-1];
		}
	}
}
inline int Lca(int l,int r){
	int p=pos[l],q=pos[r];
	if(q<p)swap(p,q);
	int t=lg[q-p+1];
	return st[p][t]<st[q-(1<<t)+1][t]?rev[p][t]:rev[q-(1<<t)+1][t];
}
inline void solve(){
	while(m--){
		int u,v;
		scanf("%lld%lld",&u,&v);
		int root=Lca(u,v);
		printf("%lld\n",root);
	}
}
signed main(){
	input();
	dfs(s,0,0);
	ST();
	solve();
	return 0;
} 
2023/10/20 15:06
加载中...