結果
| 問題 |
No.898 tri-βutree
|
| コンテスト | |
| ユーザー |
eve__fuyuki
|
| 提出日時 | 2024-06-18 14:31:41 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 289 ms / 4,000 ms |
| コード長 | 2,009 bytes |
| コンパイル時間 | 2,511 ms |
| コンパイル使用メモリ | 211,476 KB |
| 最終ジャッジ日時 | 2025-02-21 23:15:00 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 21 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
void fast_io() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
}
int main() {
fast_io();
int n;
cin >> n;
vector<vector<pair<int, int>>> g(n);
for (int i = 0; i < n - 1; i++) {
int u, v, w;
cin >> u >> v >> w;
g[u].push_back({v, w});
g[v].push_back({u, w});
}
vector<int> pre(n, -1);
vector<long long> dist(n, -1);
vector<int> dep(n, -1);
deque<int> dq{0};
pre[0] = dist[0] = dep[0] = 0;
while (!dq.empty()) {
int u = dq.front();
dq.pop_front();
for (auto [v, w] : g[u]) {
if (pre[v] == -1) {
pre[v] = u;
dist[v] = dist[u] + w;
dep[v] = dep[u] + 1;
dq.push_back(v);
}
}
}
vector<vector<int>> dbl_pre(20, vector<int>(n));
dbl_pre[0] = pre;
for (int i = 0; i < 19; i++) {
for (int j = 0; j < n; j++) {
dbl_pre[i + 1][j] = dbl_pre[i][dbl_pre[i][j]];
}
}
auto lca = [&](int u, int v) {
if (dep[u] < dep[v]) swap(u, v);
int diff = dep[u] - dep[v];
for (int i = 0; i < 20; i++) {
if (diff & (1 << i)) {
u = dbl_pre[i][u];
}
}
if (u == v) return u;
for (int i = 19; i >= 0; i--) {
if (dbl_pre[i][u] != dbl_pre[i][v]) {
u = dbl_pre[i][u];
v = dbl_pre[i][v];
}
}
return pre[u];
};
auto calc_dist = [&](int u, int v) {
return dist[u] + dist[v] - 2 * dist[lca(u, v)];
};
int q;
cin >> q;
for (; q--;) {
int x, y, z;
cin >> x >> y >> z;
// cout << x << " " << y << " " << z << " " << lca(x, y) << " "
// << lca(y, z) << " " << lca(z, x) << "\n";
long long ans = calc_dist(x, y) + calc_dist(y, z) + calc_dist(z, x);
ans /= 2;
cout << ans << "\n";
}
}
eve__fuyuki