样例不过,求条
查看原帖
样例不过,求条
996300
CMY2013楼主2025/1/21 17:07
#include<bits/stdc++.h>
using namespace std;
int n,m,tot=0,rt,f[500010],g[500010][20],siz[500010],ft[500010],fa[500010];
vector<int> vec[500010];
bool vis[500010]; 
void dfs(int u,int dep)
{
	f[++tot]=u;
	ft[u]=tot;
	vis[u]=true;
	siz[u]=dep;
	for(auto x:vec[u])
	{
		if(!vis[x])
		{
			dfs(x,dep+1);
			f[++tot]=u;
			siz[tot]=dep;
		}
	}
}

void init(int l)
{
	for(int i=1;i<=l;i++) g[i][0]=i;
	for(int j=1;(1<<j)<=l;j++)
	{
		for(int i=1;i+(1<<j)-1<=l;i++) 
		{
			int a=g[i][j-1],b=g[i+(1<<(j-1))][j-1];
			if(siz[a]<siz[b]) g[i][j]=a;
			else g[i][j]=b;
		}
	}
}

int rmq(int l,int r)
{
	int k=0;
	while(1<<(k+1)<r-l+1) k++;
	int a=g[l][k],b=g[r-(1<<k)+1][k];
	if(siz[a]<siz[b]) return a;
	else return b;
}

int lca(int l,int r)
{
	return f[rmq(min(ft[l],ft[r]),max(ft[l],ft[r]))];
}

int main()
{
	cin>>n>>m>>rt;
	int u,v;
	for(int i=1;i<n;i++)
	{
		cin>>u>>v;
		vec[u].push_back(v);
		vec[v].push_back(u);
	}
	dfs(rt,1);
	init(tot);
	for(int i=1;i<=m;i++)
	{
		cin>>u>>v;
		cout<<lca(u,v)<<endl;
	}
	return 0;
}
2025/1/21 17:07
加载中...