线下能对,提交RE是怎么回事
查看原帖
线下能对,提交RE是怎么回事
50983
Elaina_7楼主2020/10/2 15:33

rt

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int q, m, n, x, y, fu;
int next[100002*2], first[100002*2], go[100002*2], tot;
int dep[100002*2], f[100002*2][21];
int Add(int u, int v)
{
	next[++ tot] = first[u]; first[u] = tot; go[tot] = v;
	next[++ tot] = first[v]; first[v] = tot; go[tot] = u;
}
void Deal(int u, int fa)
{
	dep[u] = dep[fa] +1;
	for(int i = 0; i <= 19; i ++)
	f[u][i + 1] = f[f[u][i]][i];
	for(int i = first[u]; i; i = next[i])
	{
		int v = go[i];
		if(v == fa) continue;
		f[v][0] = u;
		Deal(v, u);
	}
}
int LCA(int x, int y)
{
	if(dep[x] < dep[y]) swap(x, y);
	for(int i = 20; i >= 0; i --)
	{
		if(dep[f[x][i]] >= dep[y]) x = f[x][i];
		if(x == y)return x;
	}
	for(int i = 20; i >= 0; i --)
	{
		if(f[x][i] != f[y][i])
		{
			x = f[x][i];
			y = f[y][i];
		}
	}
	return f[x][0];
}
int main()
{
	scanf("%d%d%d", &n, &m, &fu);
	for(int i = 1; i < n; i ++)
	{
	    scanf("%d%d", &x, &y);
		Add(x , y);
		
	}
	Deal(fu , 0);
	while(m --)
	{
		scanf("%d%d", &x , &y);
		printf("%d\n", LCA(x , y));
	}
	return 0;
}
2020/10/2 15:33
加载中...