30pts求助
查看原帖
30pts求助
945246
zhangzehao1楼主2023/12/24 11:52
#include<bits/stdc++.h>
#define UP(i,a,b) for(int i=a;i<=b;i++)
#define DN(i,a,b) for(int i=a;i>=b;i--)
#define int long long

const int M=500005;
using namespace std;

int n,m,s;
int fa[M][25];
int deep[M];
int lg[M];
bool vis[M];
vector<int> edge[M];

inline void dfs(int s,int f)
{
	int t=0;
	fa[s][0]=f;
	vis[s]=1;
	deep[s]=deep[f]+1;
	t=deep[s];
	UP(i,1,t) fa[s][i]=fa[fa[s][i-1]][i-1];
	UP(i,0,edge[s].size()-1)
	{
		int v=edge[s][i];
		if(v!=f) 
		{
			fa[v][0]=s;
			dfs(v,s);
		}	
	}	
	return;
}

inline int LCA(int u,int v)
{
	if(deep[u]<deep[v]) swap(u,v);	
	while(deep[u]>deep[v])
	{
		int g=lg[deep[u]-deep[v]];
		u=fa[u][g];	
	}
	if(u==v) return u;
	DN(i,lg[deep[u]],0)
	{
		if(fa[u][i]!=fa[v][i])
		{
			u=fa[u][i];
			v=fa[v][i];
		}
	}
	return fa[u][0];
}

signed main()
{
	//freopen("P3379_1.in","r",stdin);
	cin>>n>>m>>s;
	UP(i,1,n-1)
	{
		int u,v;
		cin>>u>>v;
		edge[u].push_back(v);
		edge[v].push_back(u);
	}
	int j=2,k=0;
	UP(i,1,(n<<1)-1)
	{
		if(i==j) 
		{
			j<<=1;
			k++;
		}
		lg[i]=k;
	}
	dfs(s,0);
	UP(i,1,m) 
	{
		int a,b;
		cin>>a>>b;
		cout<<LCA(a,b)<<"\n";
	}
	return 0;
}
2023/12/24 11:52
加载中...