本来wa1289,然后从讨论区里找灵感,随机了一下根,然后两发就ac了???
希望有大佬答疑一下,为啥这么奇怪
#include <bits/stdc++.h>
using namespace std;
// https://www.luogu.com.cn/problem/P4281
#define endl "\n"
#define IOS ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
#define rep(i, j, k) for (int i = (j); i < (k); i++)
#define all(x) x.begin(), x.end()
#define pii pair<int, int>
// #define int long long
const int N = 5e5 + 10;
const int LIMIT = 25;
int n, m;
vector<int> g[N];
int st[N][LIMIT];
int depth[N];
void dfs(int u, int fa, int dep) {
st[u][0] = fa; // 记录祖先
depth[u] = dep;
for (int i = 1; i < LIMIT; i++) {
if (st[u][i - 1] == 0) break;
st[u][i] = st[st[u][i - 1]][i - 1];
}
for (int i = 0, v; i < g[u].size(); i++) {
v = g[u][i];
if (v == fa) continue;
dfs(v, u, dep + 1);
}
}
int lca(int u, int v) {
int du = depth[u], dv = depth[v];
if (du < dv) {
swap(u, v);
swap(du, dv);
}
for (int j = LIMIT - 1; j >= 0; j--)
if (depth[st[u][j]] >= dv)
u = st[u][j];
if (u == v) return u;
for (int j = LIMIT - 1; j >= 0; j--) {
if (st[u][j] != 0 && st[u][j] != st[v][j]) {
u = st[u][j];
v = st[v][j];
}
}
return st[u][0];
}
signed main() {
IOS;
cin >> n >> m;
srand(time(0));
rep(i, 0, n - 1) {
int u, v;
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
dfs(rand() % n + 1, 0, 0);
rep(i, 0, m) {
int a, b, c;
cin >> a >> b >> c;
int v1 = lca(a, b);
int v2 = lca(b, c);
int v3 = lca(a, c);
int hi = v1 != v2 ? (depth[v1] < depth[v2] ? v1 : v2) : v1;
int lo = v1 != v2 ? (depth[v1] > depth[v2] ? v1 : v2) : v3;
cout << lo << " " << depth[a] + depth[b] + depth[c] - depth[v1] - depth[v2] - depth[v3] << endl;
}
return 0;
}