/*In FISH at EGOI25 I trust*/
/*In FISH at EGOI25 I trust*/
/*In FISH at EGOI25 I trust*/
/*In FISH at EGOI25 I trust*/
/*In FISH at EGOI25 I trust*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<ll,ll> pll;
typedef pair<pll,ll> ppl;
struct edge{
   ll to,a,b;
};
ll n,v1,v2,a,b,dv[200009][29],h,timer,tin[200009],tout[200009],d[200009],c[200009],res;
vector<edge> A[200009];
void dfs(int v,int par){
   timer++;
   tin[v]=timer;
   dv[v][0]=par;
   d[v]=d[par]+1;
   for(int i=1;i<=h;i++) dv[v][i]=dv[dv[v][i-1]][i-1];
   for(auto x:A[v]) {
      if(x.to==par) continue;
      dfs(x.to,v);
   }
   timer++;
   tout[v]=timer;
}
bool is(ll a,ll b){
   if(tin[a]<=tin[b] && tout[b]<=tout[a]) return true;
   else return false;
}
ll lca(ll a,ll b){
    if(d[a]>d[b]) swap(a,b);
   if(is(a,b)) return a;
   for(int i=h;i>=0;i--) {
      if(!is(dv[b][i],a)) b=dv[b][i];
   }
   return dv[b][0];
}
ll dfs2(ll v){
    ll u=c[v];
    ll C=0; ll B=0;
   for(auto x:A[v]){
      if(d[x.to]<d[v]) {
        C=x.a;
        B=x.b;
        continue;
      }
      u+=dfs2(x.to);
   }
   res+=min(u*C,B);
   return u;
}
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    h=22;
    cin>>n;
    for(int i=1;i<n;i++){
        cin>>v1>>v2>>a>>b;
        A[v1].push_back({v2,a,b});
        A[v2].push_back({v1,a,b});
    }
    dfs(1,1);
    for(int i=1;i<n;i++) {
       ll lc=lca(i,i+1);
       c[i]++;
       c[i+1]++;
       c[lc]--;
       c[dv[lc][0]]--;
    }
    dfs2(1);
    cout<<res<<endl;
    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... |