#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define fi first
#define sc second
#define fast cin.tie(0)->ios_base::sync_with_stdio(0)
#define ll long long
#define ii pair<ll,ll>
//#define int long long
const ll INF = (int)1e15;
const int max_n = (int)2e5;
const int MOD = (int)1e9 + 7;
const int LG = 17;
struct datas{
int pos ;
ll sum;
int cost , cnt;
} par[max_n + 5][LG + 5];
int n;
int hig[max_n + 5];
struct node{
int v , cost1 , cost2;
};
vector<node> adj[max_n + 5];
void dfs(int u,int p){
for (auto v : adj[u]){
if (v.v == p) continue;
par[v.v][0] = {u , v.cost1 , v.cost2 , 0};
hig[v.v] = hig[u] + 1;
dfs(v.v , u);
}
}
void build(){
for (int i = 1; i <= LG ; i++){
for (int j = 1; j <= n ; j++){
par[j][i].pos = par[par[j][i - 1].pos][i - 1].pos;
par[j][i].sum = par[j][i - 1].sum + par[par[j][i - 1].pos][i - 1].sum;
}
}
}
ll lca(int u,int v){
ll cost = 0;
if (hig[u] < hig[v]) swap(u , v);
for (int i = LG; i >= 0 ; i--){
if (hig[v] <= hig[par[u][i].pos]) {
cost += par[u][i].sum;
par[u][i].cnt++;
u = par[u][i].pos;
}
}
if (u == v) return cost;
for (int i = LG ; i >= 0 ; i--){
if (par[u][i].pos != par[v][i].pos){
cost += par[u][i].sum + par[v][i].sum;
par[u][i].cnt++; par[v][i].cnt++;
u = par[u][i].pos; v = par[v][i].pos;
}
}
par[u][0].cnt++; par[v][0].cnt++;
return cost + par[u][0].sum + par[v][0].sum;
}
signed main(){
fast;
//freopen("TEST.INP","r",stdin);
//freopen("TEST.OUT","w",stdout);
cin >> n;
for (int i = 1; i < n ; i++){
int u , v , cost1 , cost2; cin >> u >> v >> cost1 >> cost2 ;
adj[u].pb({v , cost1 , cost2});
adj[v].pb({u , cost1 , cost2});
}
hig[0] = -1;
dfs(1 , 0);
build();
ll ans = 0;
for (int u = 1; u < n ; u++){
//ll a = lca(u , u + 1);
ans += lca(u , u + 1);
//cout << ans <<' ' << a <<' ' <<u <<' ' << u + 1 <<'\n';
}
//ll mincost = INF;
for (int i = LG; i >= 1; i--){
for (int j = 1; j <= n ; j++){
par[j][i - 1].cnt += par[j][i].cnt;
par[par[j][i - 1].pos][i - 1].cnt += par[j][i].cnt;
}
}
for (int j = 2; j <= n ; j++){
if (par[j][0].cost < par[j][0].cnt * par[j][0].sum){
ans += par[j][0].cost - 1LL * (par[j][0].cnt * par[j][0].sum);
}
//cout << j <<' ' << par[j][0].pos <<' '<< par[j][0].cost <<' ' << par[j][0].cnt <<' '<<par[j][0].sum <<' ' << mincost <<'\n';
}
cout << ans <<'\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... |