This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define pb emplace_back
#define all(x) x.begin(),x.end()
#define fastio ios_base::sync_with_stdio(0);cin.tie(NULL);cout.tie(NULL)
#define ll long long
#define fi first
#define se second
using namespace std;
typedef pair<ll,ll> pii;
const int maxN = 1e6+1;
const int inf = 1e9;
const int MOD = 1e9+7;
struct node{
int v;
ll w,c;
node(){};
node(int v,ll w,ll c){
this->v=v;
this->w=w;
this->c=c;
}
};
int n;
vector<node> a[maxN];
int l=20;
int up[maxN][21];
int in[maxN],out[maxN],timer=0;
ll pf[maxN];
pii tr[maxN];
int mxh=0;
ll ans=0;
vector<int> d[maxN];
bool anc(int p,int s){
return in[p]<=in[s]&&out[p]>=out[s];
}
int lca(int u,int v){
if(anc(u,v)) return u;
if(anc(v,u)) return v;
for(int i=l;i>=0;i--){
if(!anc(up[u][i],v)) u=up[u][i];
}return up[u][0];
}
void dfs(int x,int pre,int h){
in[x]=timer++;
up[x][0]=pre;
mxh=max(mxh,h);
d[h].pb(x);
for(int i=1;i<=l;i++){
up[x][i]=up[up[x][i-1]][i-1];
}
for(auto i:a[x]){
if(i.v==pre) continue;
tr[i.v]=pii(i.w,i.c);
dfs(i.v,x,h+1);
}
out[x]=timer++;
}
void buildPF(){
for(int i=1;i<n;i++){
int x=lca(i,i+1);
if(x==i){
pf[i+1]++;
pf[x]--;
}else if(x==i+1){
pf[i]++;
pf[x]--;
}else{
pf[i]++;
pf[i+1]++;
pf[x]-=2;
}
}
for(int i=mxh;i>0;i--){
for(int x:d[i]){
ans+=min(tr[x].fi*pf[x],tr[x].se);
pf[up[x][0]]+=pf[x];
}
}
}
int main()
{
fastio;
int u,v,w,c;
cin>>n;
for(int i=0;i<n-1;i++){
cin>>u>>v>>w>>c;
a[u].pb(node(v,w,c));
a[v].pb(node(u,w,c));
}dfs(1,1,0);
buildPF();
cout<<ans<<endl;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |