結果
| 問題 |
No.898 tri-βutree
|
| コンテスト | |
| ユーザー |
IKyopro
|
| 提出日時 | 2019-12-24 13:48:03 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 545 ms / 4,000 ms |
| コード長 | 2,072 bytes |
| コンパイル時間 | 2,390 ms |
| コンパイル使用メモリ | 214,904 KB |
| 最終ジャッジ日時 | 2025-01-08 15:02:08 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 21 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
template<class T> using vec = vector<T>;
template<class T> using vvec = vector<vec<T>>;
struct edge{
int to,id;
ll dist;
edge(int to,ll dist=1,int id=1):to(to),id(id),dist(dist){};
};
class LCA{
private:
vvec<edge> v;
vvec<int> parent;
vec<int> depth,ord;
vec<ll> dist;
int k;
void dfs(int cur,int par,int d){
parent[0][cur] = par;
depth[cur] = d;
ord[cur] = k++;
for(auto& e:v[cur]) if(e.to!=par){
dist[e.to] = dist[cur]+e.dist;
dfs(e.to,cur,d+1);
}
}
public:
LCA(int N,int root,vvec<edge>& tree){
v = tree;
parent = vvec<int>(20,vec<int>(N,0));
depth = ord = vec<int>(N,0);
dist = vec<ll>(N,0);
k = 0;
dfs(root,-1,0);
for(int j=0;j+1<20;j++){
for(int i=0;i<N;i++){
if(parent[j][i]<0) parent[j+1][i] = -1;
else parent[j+1][i] = parent[j][parent[j][i]];
}
}
}
int lca(int n,int m){
if(depth[n]>depth[m]) swap(n,m);
for(int j=0;j<20;j++){
if((depth[m]-depth[n]) >> j&1) m = parent[j][m];
}
if(n==m) return n;
for(int j=19;j>=0;j--){
if(parent[j][n]!=parent[j][m]){
n = parent[j][n];
m = parent[j][m];
}
}
return parent[0][n];
}
int dep(int n){return depth[n];}
ll getdist(int n){return dist[n];}
int getord(int n){return ord[n];}
};
int main(){
int N;
cin >> N;
vvec<edge> g(N);
for(int i=0;i<N-1;i++){
int a,b; ll c;
cin >> a >> b >> c;
g[a].push_back({b,c});
g[b].push_back({a,c});
}
LCA lca(N,0,g);
int Q;
cin >> Q;
auto calc = [&](int a,int b){
return lca.getdist(a)+lca.getdist(b)-2*lca.getdist(lca.lca(a,b));
};
for(int q=0;q<Q;q++){
int k = 3;
vec<int> X(k);
for(int i=0;i<k;i++) cin >> X[i];
sort(X.begin(),X.end(),[&](int a,int b){
return lca.getord(a)<lca.getord(b);
});
ll ans = 0;
for(int i=0;i<k;i++){
ans += calc(X[i],X[(i+1)%k]);
}
cout << ans/2 << endl;
}
}
IKyopro