結果
問題 | No.898 tri-βutree |
ユーザー |
|
提出日時 | 2019-10-04 22:24:37 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 435 ms / 4,000 ms |
コード長 | 4,171 bytes |
コンパイル時間 | 2,284 ms |
コンパイル使用メモリ | 185,952 KB |
実行使用メモリ | 30,984 KB |
最終ジャッジ日時 | 2024-11-08 22:21:16 |
合計ジャッジ時間 | 11,229 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 21 |
ソースコード
// template version 1.12using namespace std;#include <iostream>#include <bits/stdc++.h>// varibable settings#define infile "../test/sample-1.in"#define int long long //{{{const int INF=1e18;const int MOD=1e9+7; //}}}// define basic macro {{{#define _overload3(_1,_2,_3,name,...) name#define _rep(i,n) repi(i,0,n)#define repi(i,a,b) for(int i=(int)(a);i<(int)(b);++i)#define rep(...) _overload3(__VA_ARGS__,repi,_rep,)(__VA_ARGS__)#define _rrep(i,n) rrepi(i,0,n)#define rrepi(i,a,b) for(int i=(int)((b)-1);i>=(int)(a);--i)#define rrep(...) _overload3(__VA_ARGS__,rrepi,_rrep,)(__VA_ARGS__)#define each(i,a) for (auto&& i : a)#define all(x) (x).begin(),(x).end()#define sz(x) ((int)(x).size())#define pb(a) push_back(a)#define mp(a, b) make_pair(a, b)#define ceil(a,b) ((a)+(b)-1)/(b)#define uni(x) sort(all(x));x.erase(unique(all(x)),x.end())#define ub upper_bound#define lb lower_bound#define posl(A, x) (lower_bound(all(A), x)-A.begin())#define posu(A, x) (upper_bound(all(A),x)-A.begin())template<class T> inline void chmax(T &a, const T &b) { if((a) < (b)) (a) = (b); }template<class T> inline void chmin(T &a, const T &b) { if((a) > (b)) (a) = (b); }typedef long long ll;typedef vector<int> vi;typedef vector<vi> vvi;typedef long double ld;typedef pair<int,int> pii;typedef tuple<int,int,int> iii;template<typename T> using PQ = priority_queue<T, vector<T>, greater<T>>;struct Fast { Fast(){ std::cin.tie(0); ios::sync_with_stdio(false); } } fast;#if defined(PCM) || defined(LOCAL)#include "lib/dump.hpp"#else#define dump(...) 42#define dump_1d(...) 42#define dump_2d(...) 42#endif//}}}vector<vector<pii>> G;struct LCA {int V, logV;vector<int> depth, len;vector<vector<int> > parent;LCA(int V) {this->V = V;logV = 0;while (V > (1LL<<logV)) logV++;this->depth = vector<int>(V);this->len = vector<int>(V);this->parent = vector<vector<int> >(logV, vector<int>(V));}void init(int v, int par, int d, int l) {depth[v] = d;parent[0][v] = par;len[v] = l;for (int i = 0; i < (int)G[v].size(); i++) {int w = G[v][i].first;int lc = G[v][i].second;if (w == par) continue;init(w, v, d+1, lc + l);}}void build() {for (int k = 0; k + 1 < logV; 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 < logV; k++) {if ((depth[v] - depth[u]) >> k & 1)v = parent[k][v];}if (u == v) return u;for (int k = logV-1; k >= 0; k--) {if (parent[k][u] != parent[k][v]) {u = parent[k][u];v = parent[k][v];}}return parent[0][u];}};int solve(){int n;cin>>n;G = vector<vector<pii>>(n);rep(i, n-1){int u,v,w;cin>>u>>v>>w;G[u].pb(mp(v, w));G[v].pb(mp(u, w));}dump(G);LCA lca(n);lca.init(0, -1, 0, 0);lca.build();int z = lca.query(4, 3);dump(z);queue<pii> q;q.push(mp(0,0));vector<int> d(n, INF);while (!q.empty()){int c,v;tie(c,v) = q.front();q.pop();if (c<d[v]){d[v] = c;each(el, G[v]){q.push(mp(c+el.second, el.first));}}}dump(d);int Q;cin>>Q;rep(_, Q){int x,y,z;cin>>x>>y>>z;int ans = 0;ans += d[x];ans += d[y];int p = lca.query(x, y);ans -= 2*d[p];int pp = lca.query(p, z);if (pp!=p){ans += d[p];ans += d[z];ans -= 2*d[pp];}else{int p1 = lca.query(x, z);int p2 = lca.query(y, z);ans += d[z] - max(d[p1],d[p2]);}cout << ans << endl;}return 0;}signed main() { //{{{#ifdef INPUT_FROM_FILEstd::ifstream in(infile);std::cin.rdbuf(in.rdbuf());#endifsolve();return 0;} //}}}