結果
問題 | No.898 tri-βutree |
ユーザー |
|
提出日時 | 2019-10-04 21:37:12 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 496 ms / 4,000 ms |
コード長 | 3,398 bytes |
コンパイル時間 | 2,361 ms |
コンパイル使用メモリ | 189,916 KB |
実行使用メモリ | 31,872 KB |
最終ジャッジ日時 | 2024-11-08 21:55:35 |
合計ジャッジ時間 | 12,306 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 21 |
ソースコード
#include"bits/stdc++.h"using namespace std;#define REP(k,m,n) for(int (k)=(m);(k)<(n);(k)++)#define rep(i,n) REP((i),0,(n))using ll = long long;using WGraph = vector<vector<pair<int, int>>>;using Graph = vector<vector<int>>;struct HLDecomposition {using pii = pair<int, int>;int n;Graph G;vector<int> vid, inv, par, depth, subsize, head, prev, next, type;HLDecomposition(const Graph& G_) :n(G_.size()), G(G_),vid(n, -1), inv(n), par(n), depth(n), subsize(n, 1),head(n), prev(n, -1), next(n, -1), type(n) {}void build(vector<int> roots = { 0 }) {int curtype = 0, pos = 0;for (int root : roots) {decide_heavy_edge(root);reconstruct(root, curtype++, pos);}}void decide_heavy_edge(int root) {stack<pii> st;par[root] = -1, depth[root] = 0;st.emplace(root, 0);while (!st.empty()) {int now = st.top().first;int& way = st.top().second;if (way < G[now].size()) {int child = G[now][way++];if (child == par[now])continue;par[child] = now;depth[child] = depth[now] + 1;st.emplace(child, 0);}else {st.pop();int maxsize = 0;for (auto child : G[now]) {if (child == par[now])continue;subsize[now] += subsize[child];if (maxsize < subsize[child]) {maxsize = subsize[child];prev[child] = now;next[now] = child;}}}}}void reconstruct(int root, int curtype, int& pos) {stack<int> st({ root });while (!st.empty()) {int start = st.top(); st.pop();for (int v = start; v != -1; v = next[v]) {type[v] = curtype;vid[v] = pos++;inv[vid[v]] = v;head[v] = start;for (auto child : G[v]) {if (child != par[v] && child != next[v]) {st.push(child);}}}}}int lca(int u, int v) {while (true) {if (vid[u] > vid[v])swap(u, v);if (head[u] == head[v])return u;v = par[head[v]];}}};void dfs(const WGraph& g, vector<ll>& d, int now, int par) {for (auto next : g[now]) {int v, w;tie(v, w) = next;if (v == par)continue;d[v] = d[now] + w;dfs(g, d, v, now);}}int main(){int N, Q;cin >> N;WGraph wg(N);Graph g(N);rep(i, N - 1) {int u, v, w;cin >> u >> v >> w;wg[u].emplace_back(v, w);wg[v].emplace_back(u, w);g[u].push_back(v);g[v].push_back(u);}HLDecomposition hld(g); hld.build();vector<ll> d(N);dfs(wg, d, 0, -1);auto dist = [&](int l, int r) {return d[l] + d[r] - 2 * d[hld.lca(l, r)];};cin >> Q;while (Q--) {ll x, y, z;cin >> x >> y >> z;ll res = dist(x, y) + dist(y, z) + dist(z, x);cout << res / 2 << endl;}return 0;}