#include <iostream>
#include <algorithm>
#include <cmath>
#include <map>
#include <vector>
#include <math.h>
#include <cmath>
#include <string>
#include <set>
#include <functional>
#include <complex>
#include <queue>
#include <random>
#include <chrono>
#include <unordered_map>
//#pragma GCC optimize("O3,unroll-loops")
//#pragma GCC optimize("Ofast")
//#pragma GCC optimize ("unroll-loops")
//#pragma GCC target("avx,avx2,tune=native")
typedef long double ld;
using ll = long long;
using ld = long double;
using ull = unsigned long long;
using pp = std::pair<ll, ll>;
using mll = std::map<ll, ll>;
using cd = std::complex<double>;
using unm = std::unordered_map<ll, ll>;
#define speed ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define yes cout << "YES" << '\n'
#define no cout << "NO" << '\n'
#define DDD ll gcd(ll a, ll b) { while (b) b ^= a ^= b ^= a %= b; return a; }
#define RRR mt19937 rand_(chrono::steady_clock::now().time_since_epoch().count()); ll randll() { return uniform_int_distribution<ll>()(rand_); }
using namespace std;
struct road {
	ll to, c1, c2;
};
ll n, ans = 0;
vector<road> g[200005];
ll tin[200005], tout[200005], depth[200005], t = 1, Z[200005][20], par[200005], c1[200005], c2[200005], cnt[200005];
void ZZZ(ll node = 1, ll pr = 1, ll dep = 1) {
	par[node] = pr;
	depth[node] = dep;
	tin[node] = t; t++;
	Z[node][0] = pr;
	for (ll st = 1; st < 20; st++) {
		Z[node][st] = Z[Z[node][st - 1]][st - 1];
	}
	for (road x : g[node]) {
		if (x.to != pr) {
			c1[x.to] = x.c1;
			c2[x.to] = x.c2;
			ZZZ(x.to, node, dep + 1);
		}
	}
	tout[node] = t; t++;
}
ll lca(ll v, ll u) {
	for (ll st = 19; v != u;) {
		if (depth[v] < depth[u])swap(v, u);
		if (tin[Z[v][st]] <= tin[u] && tout[u] <= tout[Z[v][st]] && st != 0) st--;
		else 
			v = Z[v][st];
	}
	return v;
}
void ADD(ll v, ll u) {
	ll w = lca(v, u);
	cnt[v]++;
	cnt[u]++;
	cnt[w]--;
	cnt[w]--;
}
void fill_cnt(ll node = 1) {
	ll lnr = cnt[node];
	for (road x : g[node]) {
		if (x.to != par[node]) {
			fill_cnt(x.to);
			lnr += cnt[x.to];
		}
	}
	cnt[node] = lnr;
	ans += min(c2[node], c1[node] * lnr);
}
int main() {
	speed;
	cin >> n;
	for (ll i = 1; i < n; i++) {
		ll a, b, c1, c2;
		cin >> a >> b >> c1 >> c2;
		g[a].push_back({ b, c1, c2 });
		g[b].push_back({ a, c1, c2 });
	}
	ZZZ();
	for (ll i = 1; i < n; i++) {
		ADD(i, i + 1);
	}
	fill_cnt();
	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... |