#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
using namespace std;
using ll = long long;
using ld = long double;
int n,Q;
struct st{
int node,c,cr;
};
vector<st> v[200002];
ll ans[200002];
vector<pair<ll,ll>> av;
int sub[200002];
bool cut[200002];
ll d0[200002];
ll dfs(int node, int b, int ii, int rt){
ll mx = 0;
vector<pair<ll,ll>> t;
for(st nxt:v[node])if(nxt.node!=b && !cut[nxt.node]){
t.push_back({ii,dfs(nxt.node,node,ii,rt)+nxt.c});
mx = max(mx,t[t.size()-1].second);
if(node==rt)ii++;
}
bool tf=true;
for(pair<ll,ll> ele:t){
if(mx==ele.second && tf){
tf=false;
if(node==rt)av.push_back({ele.second,ele.first});
}
else{
av.push_back({ele.second,ele.first});
}
}
return mx;
}
ll dfs0(int node, int b){
ll ret = 0;
for(st nxt:v[node])if(nxt.node!=b){
ret+=dfs0(nxt.node,node);
ret+=nxt.cr;
}
return ret;
}
void dfs1(int node, int b, ll cur){
d0[node] = cur;
for(st nxt:v[node])if(nxt.node!=b){
dfs1(nxt.node,node,cur+nxt.c-nxt.cr);
}
}
void cdfs(int node, int b){
sub[node] = 1;
for(st nxt:v[node])if(nxt.node!=b && !cut[nxt.node]){
cdfs(nxt.node,node);
sub[node]+=sub[nxt.node];
}
}
int getCent(int node, int b, int siz){
for(st nxt:v[node])if(nxt.node!=b && !cut[nxt.node] && sub[nxt.node]*2>siz)return getCent(nxt.node,node,siz);
return node;
}
void dnc(int node){
cdfs(node,0);
int cent = getCent(node,0,sub[node]);
av.clear();
dfs(cent,0,0,cent);
ll cur = d0[cent];
ans[1] = max(ans[1],cur);
sort(av.begin(),av.end());
reverse(av.begin(),av.end());
int ch = 0;
for(st nxt:v[cent]){
if(!cut[nxt.node])ch++;
}
if(ch==1){
for(int j=0;j<av.size();j++){
cur+=av[j].first;
ans[j+2] = max(ans[j+2],cur);
}
}
else if(av.size()>=2){
int k = -1;
for(int j=1;j<av.size();j++){
if(av[j].second!=av[0].second){
k = j;
cur+=av[j].first;
break;
}
}
assert(k!=-1);
for(int j=0;j<av.size();j++){
if(j==k)continue;
cur+=av[j].first;
ans[j+2] = max(ans[j+2],cur);
}
}
cut[cent] = 1;
for(st nxt:v[cent])if(!cut[nxt.node])dnc(nxt.node);
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
ll s = 0;
for(int i=0;i<n-1;i++){
int a,b,c,cr;
cin>>a>>b>>c>>cr;
v[a].push_back({b,c,cr});
v[b].push_back({a,cr,c});
s+=c+cr;
}
dfs1(1,0,dfs0(1,0));
dnc(1);
for(int i=1;i<=n;i++)ans[i] = max(ans[i],ans[i-1]);
cin>>Q;
while(Q--){
int q;
cin>>q;
cout<<s-ans[q]<<'\n';
}
return 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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |