#include <bits/stdc++.h>
#define ii pair<int, int>
#define fi first
#define se second
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
using ll = long long;
const ll mod=1e9+7;
const int nx=5e4+5;
const int LG=18;
int n, q, a[nx], h[nx], up[nx][LG], dep[nx], st[nx], tim=0, en[nx];
vector<ii> adj[nx];
bool ok[nx];
void dfs(int u)
{
st[u]=++tim;
for(auto it:adj[u])
{
int v, w;
tie(v, w)=it;
if(v==up[u][0]) continue;
up[v][0]=u;
h[v]=h[u]+1;
dep[v]=dep[u]+w;
for(int i = 1; i < LG; i++)
up[v][i]=up[up[v][i-1]][i-1];
dfs(v);
}
en[u]=tim;
}
bool cmp(int x, int y)
{
return st[x]<st[y];
}
int jump(int u, int k)
{
for(int i = 0; i < LG; i++)
if(k>>i&1) u=up[u][i];
return u;
}
int lca(int u, int v)
{
if(h[u]<h[v]) swap(u, v);
u=jump(u, h[u]-h[v]);
if(u==v) return u;
for(int i = LG-1; i >= 0; i--)
if(up[u][i]!=up[v][i])
u=up[u][i], v=up[v][i];
return up[u][0];
}
stack<int> f;
int main()
{
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin>>n;
for(int i = 1; i < n; i++)
{
int u, v, w;
cin>>u>>v>>w;
u++, v++;
adj[u].emplace_back(v, w);
adj[v].emplace_back(u, w);
}
dfs(1);
cin>>q;
while(q--)
{
int k=5, ans=0;
for(int i = 1; i <= k; i++)
cin>>a[i], a[i]++, ok[a[i]]=1;
sort(a+1, a+k+1, cmp);
for(int i = 1; i < k; i++)
{
int p=lca(a[i], a[i+1]);
if(!ok[p])
{
ok[p]=1;
a[++k]=p;
}
}
sort(a+1, a+k+1, cmp);
while(f.size()) f.pop();
f.push(a[1]);
for(int i = 2; i <= k; i++)
{
while(f.size() && en[f.top()]<en[a[i]]) f.pop();
ans+=dep[a[i]]-dep[f.top()];
f.push(a[i]);
}
cout<<ans<<'\n';
for(int i = 1; i <= k; i++)
ok[a[i]]=0;
}
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |