- How far away ?
code
- @ 2026-2-10 10:14:53
void solve() {
int n, q;
cin >> n >> q;
vector<vector<pii>> 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);
vector<ll> len(n + 1);
const int M = 20;
vector<vector<int>> f(M + 1, vector<int>(n + 1));
auto dfs = [&] (auto &&self, int u, int fa)->void {
for (auto [v, w] : e[u]) {
if (v == fa) continue;
f[0][v] = u;
dep[v] = dep[u] + 1;
len[v] = len[u] + w;
self(self, v, u);
}
};
dfs(dfs, 1, 0);
for (int j = 1; j <= M; j++) {
for (int x = 1; x <= n; x++) {
int y = f[j - 1][x];
f[j][x] = f[j - 1][y];
}
}
auto jump = [&] (int x, int len) {
for (int j = 0; j <= M; j++) {
if ((len >> j) & 1) {
x = f[j][x];
}
}
return x;
};
auto lca = [&] (int x, int y) {
if (dep[x] < dep[y]) swap(x, y);
x = jump(x, dep[x] - dep[y]);
assert(dep[x] == dep[y]);
if (x == y) return x;
for (int j = M; j >= 0; j--) {
int nx = f[j][x], ny = f[j][y];
if (nx == ny) continue;
x = nx, y = ny;
}
return f[0][x];
};
auto dis = [&] (int x, int y) {
int l = lca(x, y);
ll ans = len[x] - len[l] + (len[y] - len[l]);
return ans;
};
while (q--) {
int x, y;
cin >> x >> y;
cout << dis(x, y) << '\n';
}
}
0 条评论
目前还没有评论...
信息
- ID
- 441
- 时间
- ms
- 内存
- MiB
- 难度
- 7
- 标签
- (无)
- 递交数
- 51
- 已通过
- 12
- 上传者