結果
問題 | No.898 tri-βutree |
ユーザー | treeone |
提出日時 | 2019-10-04 23:30:29 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 809 ms / 4,000 ms |
コード長 | 2,408 bytes |
コンパイル時間 | 2,659 ms |
コンパイル使用メモリ | 217,088 KB |
実行使用メモリ | 60,636 KB |
最終ジャッジ日時 | 2024-11-08 22:32:43 |
合計ジャッジ時間 | 17,199 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 263 ms
60,636 KB |
testcase_01 | AC | 3 ms
5,760 KB |
testcase_02 | AC | 4 ms
5,760 KB |
testcase_03 | AC | 4 ms
5,888 KB |
testcase_04 | AC | 4 ms
5,760 KB |
testcase_05 | AC | 4 ms
5,760 KB |
testcase_06 | AC | 4 ms
5,888 KB |
testcase_07 | AC | 781 ms
57,560 KB |
testcase_08 | AC | 784 ms
57,684 KB |
testcase_09 | AC | 790 ms
57,560 KB |
testcase_10 | AC | 791 ms
57,564 KB |
testcase_11 | AC | 790 ms
57,560 KB |
testcase_12 | AC | 802 ms
57,560 KB |
testcase_13 | AC | 808 ms
57,688 KB |
testcase_14 | AC | 809 ms
57,556 KB |
testcase_15 | AC | 802 ms
57,560 KB |
testcase_16 | AC | 805 ms
57,552 KB |
testcase_17 | AC | 794 ms
57,556 KB |
testcase_18 | AC | 788 ms
57,560 KB |
testcase_19 | AC | 780 ms
57,564 KB |
testcase_20 | AC | 779 ms
57,564 KB |
testcase_21 | AC | 784 ms
57,560 KB |
ソースコード
#include <bits/stdc++.h> #define rep(i, a, n) for(int i = a; i < n; i++) #define int long long using namespace std; typedef pair<int, int> P; const int mod = 1000000007; const int INF = 1e18; struct LowestCommonAncestor{ const int MAX_LOG_V = 50; vector<vector<int> > G, parent; int root = 0, V; vector<int> depth; LowestCommonAncestor(int _V){ V = _V; G.resize(V); parent.resize(MAX_LOG_V, vector<int>(V)); depth.resize(V); } void add_edge(int u, int v){ G[u].push_back(v); G[v].push_back(u); } void dfs(int v, int p, int d){ parent[0][v] = p; depth[v] = d; for(int i = 0; i < G[v].size(); i++){ if(G[v][i] != p) dfs(G[v][i], v, d + 1); } } void build(){ dfs(root, -1, 0); for(int k = 0; k + 1 < MAX_LOG_V; k++){ for(int v = 0; v < V; v++){ if(parent[k][v] < 0) parent[k + 1][v] = -1; else parent[k + 1][v] = parent[k][parent[k][v]]; } } } int query(int u, int v){ if(depth[u] > depth[v]) swap(u, v); for(int k = 0; k < MAX_LOG_V; k++){ if((depth[v] - depth[u]) >> k & 1){ v = parent[k][v]; } } if(u == v) return u; for(int k = MAX_LOG_V - 1; k >= 0; k--){ if(parent[k][u] != parent[k][v]){ u = parent[k][u]; v = parent[k][v]; } } return parent[0][u]; } }; struct edge{ int v, w; }; vector<edge> G[100010]; int sum[100010]; void dfs(int v, int p, int now){ sum[v] = now; for(auto i : G[v]){ if(i.v == p) continue; dfs(i.v, v, now + i.w); } } signed main(){ cin.tie(nullptr); ios::sync_with_stdio(false); int n; cin >> n; LowestCommonAncestor lca(n); rep(i, 0, n - 1){ int u, v, w; cin >> u >> v >> w; G[u].push_back({v, w}); G[v].push_back({u, w}); lca.add_edge(u, v); } dfs(0, -1, 0); lca.build(); int q; cin >> q; while(q--){ int x, y, z; cin >> x >> y >> z; auto f = [](int u, int v, int w){ return sum[u] + sum[v] - 2 * sum[w]; }; int ans = (f(x, y, lca.query(x, y)) + f(y, z, lca.query(y, z)) + f(z, x, lca.query(z, x))) / 2; cout << ans << endl; } }