样例过全WA球挑选管
查看原帖
样例过全WA球挑选管
267125
宋小陀螺楼主2024/3/9 21:36
#include<bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5,LOGN = 20;
int n,m,s,fa[N][LOGN],dep[N];
vector<int> gra[N];
void bdtr(int k) 
{
	dep[k] = dep[fa[k][0]] + 1;
	for (int i = 1;fa[k][i - 1];i++) fa[k][i] = fa[fa[k][i - 1]][i - 1];
	for (auto son: gra[k]) 
		if (son != fa[k][0]) 
		{
			fa[son][0] = k;
			bdtr(son);
		}
}
int lca(int a,int b) 
{
	if (dep[a] < dep[b]) swap(a,b);
	for (int i = LOGN - 1;dep[a] > dep[b];i--) 
		if (dep[fa[a][i]] >= dep[b]) a = fa[a][i];
	for (int i = LOGN - 1;i;i--) 
		if (fa[a][i] != fa[b][i]) 
		{
			a = fa[a][i];
			b = fa[b][i];
		}
	if (dep[a] <= 1 || dep[b] <= 1) return s;
	else return fa[a][0];
}
int main()
{
	int x,y,a,b;
	cin >> n >> m >> s;
	for (int i = 1;i < n;i++) 
	{
		cin >> x >> y;
		gra[x].push_back(y);
		gra[y].push_back(x);
	}
	bdtr(s);
	for (int i = 1;i <= m;i++) 
	{
		cin >> a >> b;
		cout << lca(a,b) << endl;
	}
	return 0;
}

2024/3/9 21:36
加载中...