結果
| 問題 |
No.898 tri-βutree
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-04-30 22:02:02 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 196 ms / 4,000 ms |
| コード長 | 1,851 bytes |
| コンパイル時間 | 2,037 ms |
| コンパイル使用メモリ | 182,344 KB |
| 実行使用メモリ | 26,188 KB |
| 最終ジャッジ日時 | 2024-11-19 11:38:29 |
| 合計ジャッジ時間 | 7,887 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 21 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int n, u, v, w, Q;
cin >> n;
vector<vector<pair<int, int>>> g(n);
for(int i = 1; i < n; i++){
cin >> u >> v >> w;
g[u].emplace_back(v, w);
g[v].emplace_back(u, w);
}
int logv = __lg(n), timer = 0;
vector<vector<int>> parent(logv + 1, vector<int>(n, -1));
vector<int> depth(n), order(n);
vector<ll> dist(n);
function<void(int, int)> dfs = [&](int v, int p){
order[v] = timer++;
int log_v = __lg(max(1, depth[v]));
for(int i = 0; i < log_v; i++){
parent[i + 1][v] = parent[i][v] == -1 ? -1 : parent[i][parent[i][v]];
}
for(auto &&pa : g[v]){
tie(u, w) = pa;
if(u == p) continue;
parent[0][u] = v;
depth[u] = depth[v] + 1;
dist[u] = dist[v] + w;
dfs(u, v);
}
};
dfs(0, -1);
auto lca = [&](int u, int v){
if(depth[u] > depth[v]) swap(u, v);
int d = depth[v] - depth[u];
while(d){
v = parent[__lg(d & -d)][v];
d -= d & -d;
}
if(u == v) return v;
for(int i = __lg(depth[v]); i >= 0; i--){
if(parent[i][v] != parent[i][u]){
v = parent[i][v];
u = parent[i][u];
}
}
return parent[0][v];
};
array<int, 3> ver;
cin >> Q;
while(Q--){
for(auto &&v : ver) cin >> v;
sort(ver.begin(), ver.end(), [&](int vl, int vr){return order[vl] < order[vr];});
ll ans = 0;
for(int i = 0; i < 3; i++){
ans += dist[ver[i]];
ans -= dist[lca(ver[i], ver[i + 1 == 3 ? 0 : i + 1])];
}
cout << ans << '\n';
}
}