求调,最后四个数据wa,虽然已经100分了。但是怎么回事
查看原帖
求调,最后四个数据wa,虽然已经100分了。但是怎么回事
355377
xiaozhuo楼主2023/7/20 21:02
#include<bits/stdc++.h>
using namespace std;
#define N 500010
int cont, head[N], Next[N * 2], val[N * 2], d[N], f[N][20], t;
void add(int u, int v)
{
	val[++ cont] = v;
	Next[cont] = head[u];
	head[u] = cont;
}
int n, p, rt;
queue<int> q;
void bfs()
{
	q.push(rt);
	d[rt] = 1;
	while(q.size())
	{
		int now = q.front();
		q.pop();
		for(int i = head[now];i;i = Next[i])
		{
			int s = val[i];
			if(d[s]) continue;
			d[s] = d[now] + 1;
			f[s][0] = now;
			for(int j = 1;j <= t;j ++) f[s][j] = f[f[s][j - 1]][j - 1];
			q.push(s);
		}
	}
}
int lac(int x, int y)
{
	if(d[x] > d[y]) swap(x, y);
	for(int j = t;j >= 0;j --)
		if(d[f[y][j]] >= d[x]) y = f[y][j];
	if(x == y) return y;
	for(int j = t;j >= 0;j --)
		if(f[x][j] != f[y][j]) x = f[x][j], y = f[y][j];
	return f[x][0];
}
int main()
{
	cin >> n >> p >> rt;
	int a, b;
	t = log(n) + 1;
	for(int i = 1;i < n;i ++)
	{
		cin >> a >> b;
		add(a, b);
		add(b, a);
	}
	bfs();
	for(int i = 1;i <= p;i ++)
	{
		cin >> a >> b;
		if(a == b) cout << a << endl;
		else printf("%d\n", lac(a, b));
	}
	return 0;
}
2023/7/20 21:02
加载中...