제출 #925539

#제출 시각아이디문제언어결과실행 시간메모리
925539NK_Putovanje (COCI20_putovanje)C++17
110 / 110
128 ms28756 KiB
// Success consists of going from failure to failure without loss of enthusiasm
#include <bits/stdc++.h>

using namespace std;

#define nl '\n'
#define pb push_back
#define f first
#define s second
#define mp make_pair

using ll = long long;
template<class T> using V = vector<T>;
using pi = pair<int,int>;
using vi = V<int>;
using vpi = V<pi>;

const int MOD = 1e9 + 7;
const int LG = 19;

int main() {
	cin.tie(0)->sync_with_stdio(0);

	int N; cin >> N;

	vi W(N - 1), MW(N - 1);
	V<vpi> adj(N); for(int i = 0; i < N - 1; i++) {
		int u, v; cin >> u >> v; --u, --v; 
		cin >> W[i] >> MW[i];
		adj[u].pb(mp(v, i));
		adj[v].pb(mp(u, i));
	}

	V<vi> up(N, vi(LG)); vi idx(N, -1), dep(N, 0);
	function<void(int, int)> gen = [&](int u, int p) {
		up[u][0] = p;

		for(int i = 1; i < LG; i++) up[u][i] = up[up[u][i-1]][i-1];

		for(auto& e : adj[u]) {
			int v, i; tie(v, i) = e; 
			if (v == p) continue;

			idx[v] = i; dep[v] = dep[u] + 1; 
			gen(v, u);
		}
	};

	gen(0, 0);

	auto jmp = [&](int u, int d) {
		for(int i = 0; i < LG; i++) if ((d >> i) & 1) u = up[u][i];
		return u;
	};

	auto lca = [&](int a, int b) {
		if (dep[a] < dep[b]) swap(a, b);
		
		a = jmp(a, dep[a] - dep[b]);
		if (a == b) return a;

		for(int i = LG - 1; i >= 0; i--) {
			if (up[a][i] != up[b][i]) {
				a = up[a][i], b = up[b][i];
			}
		}
		
		return up[a][0];
	};


	vi BAL(N);
	for(int i = 0; i + 1 < N; i++) {
		// path from i to i + 1
		int l = lca(i, i + 1);

		// cerr << i << " " << i + 1 << " ==> " << l << endl;
		BAL[i]++, BAL[i + 1]++;
		BAL[l] -= 2;
	}

	ll ans = 0;
	function<int(int, int)> dfs = [&](int u, int p) {
		int bal = 0;

		for(auto& e : adj[u]) {
			int v, i; tie(v, i) = e;
			if (v == p) continue;
			bal += dfs(v, u);
		}

		bal += BAL[u];

		// cerr << u << " => " << bal << endl;
		if (idx[u] != -1) {
			int i = idx[u];
			ans += min(W[i] * 1LL * bal, MW[i] + 0LL);
		}

		return bal;
	};

	dfs(0, -1);

	cout << ans << nl;

	exit(0-0);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...