30ptsAC #1#2#3求调
查看原帖
30ptsAC #1#2#3求调
566833
遥遥领先楼主2024/7/26 15:57
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 500010,M = 30;
int n,m,rt,x,y,dep[N],dp[N][M],lg[M];
vector <int> v[N];

void init()
{
	for (int i = 2;i <= n;i++)
		lg[i] = lg[i>>1]+1;
}

void dfs(int u,int fa,int deep)
{
	dep[u] = deep;
	dp[u][0] = fa;
	for (int i = 1;i <= lg[deep];i++)
		dp[u][i] = dp[dp[u][i-1]][i-1];
	for (int i = 0;i < v[u].size();i++)
		if (v[u][i] != fa)
			dfs(v[u][i],u,deep+1);
}

int lca(int x,int y)
{
	if (dep[x] < dep[y])
		swap(x,y);
	while (dep[x] > dep[y])
		x = dp[x][lg[dep[x]-dep[y]]];
	if (x == y)
		return x;
	for (int i = lg[dep[x]];i+1;i--)
		if (dp[x][i] != dp[y][i])
			x = dp[x][i],y = dp[y][i];
	return dp[x][0];
}

void solve()
{
	init();
	scanf("%lld%lld%lld",&n,&m,&rt);
	for (int i = 1;i < n;i++)
		scanf("%lld%lld",&x,&y),v[x].push_back(y),v[y].push_back(x);
	dfs(rt,-1,1);
	while (m--)
		scanf("%lld%lld",&x,&y),printf("%lld\n",lca(x,y));
}

signed main()
{
	solve();
	printf("\n");
	return 0;
}

AC#3#4#5
WA#6#7#8#9
TLE#1#2#10#11#12#13#14

2024/7/26 15:57
加载中...