結果
問題 |
No.1094 木登り / Climbing tree
|
ユーザー |
|
提出日時 | 2020-07-02 08:47:10 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 760 ms / 2,000 ms |
コード長 | 1,379 bytes |
コンパイル時間 | 568 ms |
コンパイル使用メモリ | 75,768 KB |
最終ジャッジ日時 | 2025-01-11 13:57:18 |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 26 |
ソースコード
#include <iostream> #include <vector> #include <assert.h> using namespace std; vector<pair<int,int>> g[200000]; int p[200000][20]; long long cum[200000]; int dep[200000]; void dfs(int cur,int par,int d,int c) { cum[cur]=c; dep[cur]=d; p[cur][0]=par; for (auto e:g[cur]) if (e.first!=par) { dfs(e.first,cur,d+1,c+e.second); } } int lca(int a,int b) { if (a==b) return a; if (dep[a]<dep[b]) swap(a,b); if (dep[a]!=dep[b]) { int d=dep[a]-dep[b]; for (int i=0;i<20;++i) { if ((d&(1<<i))>0) { a=p[a][i]; } } return lca(a,b); } for (int i=19;i>=0;--i) { if (p[a][i]!=p[b][i]) { a=p[a][i]; b=p[b][i]; } } return p[a][0]; } int main() { int N,Q; cin>>N; for (int i=0;i<N-1;++i) { int a,b,c; cin>>a>>b>>c; --a;--b; g[a].push_back({b,c}); g[b].push_back({a,c}); } dfs(0,-1,0,0); for (int i=1;i<20;++i) { for (int src=0;src<N;++src) { int middle=p[src][i-1]; p[src][i]=middle==-1?middle:p[middle][i-1]; } } cin>>Q; for (int q=0;q<Q;++q) { int s,t,w; cin>>s>>t; --s;--t; w=lca(s,t); long long ans=cum[s]+cum[t]-2*cum[w]; cout<<ans<<endl; } }