- How far away ?
O(1)LCA
- @ 2026-7-25 11:15:17
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int, int>
struct ST {
vector<vector<int>> f;
int n, m;
vector<int> a;
ST(vector<int> a_) {
a = a_;
n = a.size();
m = __lg(n);
f.assign(m + 1, vector(n, 0));
for (int i = 1; i < n; i++) f[0][i] = i;
for (int j = 1; j <= m; j++) {
for (int i = 1; i < n; i++) {
if (i + (1 << j - 1) >= n) break;
// f[j][i] = max(f[j - 1][i], f[j - 1][i + (1 << j - 1)]);
f[j][i] = a[f[j-1][i]] < a[f[j-1][i+(1<<j-1)]] ? f[j-1][i] : f[j-1][i+(1<<j-1)];
}
}
}
int get(int l, int r) {
int len = r - l + 1;
int j = __lg(len);
return a[f[j][l]] < a[f[j][r-(1<<j)+1]] ? f[j][l] : f[j][r-(1<<j)+1];
}
};
void solve() {
int n, m;
cin >> n >> m;
vector e(n + 1, vector<pii>());
for (int i = 1, u, v, w; i < n; i++) {
cin >> u >> v >> w;
e[u].push_back({v, w});
e[v].push_back({u, w});
}
vector<int> dep(n + 1), len(n + 1), f(n + 1), dfn(n + 1), node(n + 1);
int cnt = 0;
auto dfs = [&] (auto &&self, int u, int fa)->void {
dfn[u] = ++cnt;
node[cnt] = u;
for (auto [v, w] : e[u]) {
if (v == fa) continue;
dep[v] = dep[u] + 1, len[v] = len[u] + w;
f[v] = u;
self(self, v, u);
}
};
dfs(dfs, 1, 0);
vector<int> dep1(n + 1);
for (int i = 1; i <= n; i++) dep1[dfn[i]] = dep[i];
ST st(dep1);
auto lca = [&] (int x, int y)->int {
if (x == y) return x;
x = dfn[x], y = dfn[y];
if (x > y) swap(x, y);
auto son = node[st.get(x + 1, y)];
return f[son];
};
while (m--) {
int x, y;
cin >> x >> y;
int l = lca(x, y);
cout << len[x] - len[l] + (len[y] - len[l]) << '\n';
}
}
signed main() {
ios::sync_with_stdio(0); cin.tie(0);
int t = 1;
cin >> t;
while (t--) solve();
return 0;
}
/*
g++ -std=c++20 1.cpp -o 1 && 1 < in.txt > out.txt
*/
3 条评论
-
郑旭阳 钻石 Lv.迷途 @ 2026-7-27 10:22:439178
-
@ 2026-7-25 11:49:1523456787234569
-
@ 2026-7-25 11:44:04zhe
- 1
信息
- ID
- 513
- 时间
- ms
- 内存
- MiB
- 难度
- 5
- 标签
- (无)
- 递交数
- 68
- 已通过
- 27
- 上传者