求助巨佬
查看原帖
求助巨佬
384064
kevin985楼主2021/7/21 22:17
#include <bits/stdc++.h>
#include <cstring>
#define INF 0x7f7f7f7f
#define eps 1e-6
#define ll long long
#define ull unsigned long long
#define N 500010
#define _rep(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define rint register int
using namespace std;
int n,m,s;
struct Edge{
	int to,next;
}edge[N << 2];
int nbs[N],cnt;
int dep[N],fa[N][22];
int lg[N];
inline int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
	return s*w;
}
inline void add(int u,int v)
{
	edge[++cnt].to = v;
	edge[cnt].next = nbs[u];
	nbs[u] = cnt;
}
inline void dfs(int now,int fath)
{
	fa[now][0] = fath;
	dep[now] = dep[fath] + 1;
	for(int i=1;i<=lg[dep[now]];i++)
	{
		fa[now][i] = fa[fa[now][i - 1]][i - 1];
	}
	for(int i=nbs[now];i;i=edge[i].next)
	{
		int to = edge[i].to;
		if(to != fath) dfs(to,now);
	}
}
inline int lca(int x,int y)
{
//	if(x == s || y == s) return s;
	if(dep[x] < dep[y]) swap(x,y);
	while(dep[x] > dep[y])
	{
		x = fa[x][lg[dep[x] - dep[y]] - 1];
	}
	if(x == y) return x;
	for(int i=lg[dep[x]] - 1;i;i--)
	{
		if(fa[x][i] != fa[y][i])
		{
			x = fa[x][i],y = fa[y][i];
		}
	}
	return fa[x][0];
}
int main()
{
//	std::ios::sync_with_stdio(false);
	n = read(),m = read(),s = read();
	for(int i=1;i<n;i++)
	{
		int u = read(),v = read();
		add(u,v); add(v,u);
	}
	for(int i=1;i<=n;i++)
	{
		lg[i] = lg[i-1] + (1 << lg[i-1] == i);
	}
	dfs(s,0);
	while(m--)
	{
		int u = read(),v = read();
		printf("%d\n",lca(u,v));
	}
	return 0;
}
2021/7/21 22:17
加载中...