只有样例对求救
查看原帖
只有样例对求救
1256325
XYHLYCHRIS楼主2024/11/29 21:52
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll read();
const ll NUM = 5e5 + 5;
ll n, q, s, fa[NUM][31], d[NUM], maxd;
vector<ll> pos[NUM];
void BUILD(ll x, ll f) {
	fa[x][0] = f, d[x] = d[f] + (x != f), maxd = max(maxd, d[x]);
	for (ll i = 0; i < pos[x].size(); i++)
		if (pos[x][i] != f) BUILD(pos[x][i], x);
}
int main() {
	cin.tie(0), cout.tie(0) ->sync_with_stdio(0);
	n = read(), q = read(), s = read();
	for (ll u, v, i = 1; i < n; i++) {
		u = read(), v = read();
		pos[u].push_back(v), pos[v].push_back(u);
	} BUILD(s, s);
	for (ll pw = 1; pw <= 30; pw++)
		for (ll i = 1; i <= n; i++)
			fa[i][pw] = fa[fa[i][pw - 1]][pw - 1];
	for (ll u, v; q; q--) {
		u = read(), v = read();
		if (d[u] < d[v]) swap(u, v);
		ll b = d[u] - d[v], a = 0;
		while (b) {
			if (b & 1) u = fa[u][a];
			a++, b >>= 1;
		}
		for (ll i = 30; i >= 0; i--) {
			if (fa[u][i] != fa[v][i]) u = fa[u][i], v = fa[v][i];
		}
		cout << fa[u][0] << '\n';
	}
	return 0;
}
inline ll read() {
	ll x = 0, f = 1;
	char ch = getchar();
	while (ch < '0' || '9' < ch)
	f = ch != '-', ch = getchar();
	while ('0' <= ch && ch <= '9')
	x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar() ;
	return f? x: -x;
}
2024/11/29 21:52
加载中...