Submission #1272250

#TimeUsernameProblemLanguageResultExecution timeMemory
1272250nhq0914Putovanje (COCI20_putovanje)C++17
110 / 110
86 ms22128 KiB
#include <bits/stdc++.h>
#define vpii vector <pair <int, int>>
using namespace std;
using ll = int64_t;
const int N = 2e5 + 1, Log = 18;
int n;
int h[N];
int par[N][Log];
int price[N][2];
int rtail[N];
ll dif[N], ans;
vpii g[N];
void dfs(int v){
	for(pair <int, int> &x: g[v]) if(x.first != par[v][0]){
		int &u = x.first;
		par[u][0] = v;
		h[u] = h[v] + 1;
		rtail[u] = x.second;
		for(int i = 1; i < Log; ++i)
			par[u][i] = par[par[u][i - 1]][i - 1];
		dfs(u);
	}
}
int getlca(int u, int v){
	int dif = h[u] - h[v];
	if(dif < 0){
		dif = -dif;
		u ^= v ^= u ^= v;
	}
	for(int i = 0; i < Log; ++i) if(dif >> i & 1) u = par[u][i];
	if(u == v) return u;
	for(int i = Log - 1; ~i; --i) if(par[u][i] != par[v][i])
		u = par[u][i], v = par[v][i];
	return par[u][0];
}
void dfssolve(int v){
	for(pair <int, int> &x: g[v]) if(x.first != par[v][0]){
		dfssolve(x.first);
		dif[v] += dif[x.first];
	}
	if(v != 1)
		ans += min(price[rtail[v]][0] * dif[v], (ll) price[rtail[v]][1]);
}
int main(){
	ios::sync_with_stdio(false); cin.tie(nullptr);
	cin >> n;
	for(int u, v, i = 1; i < n; ++i){
		cin >> u >> v >> price[i][0] >> price[i][1];
		g[u].push_back({v, i});
		g[v].push_back({u, i});
	}
	dfs(1);
	for(int lca, u, v, i = 2; i <= n; ++i){
		lca = getlca(i - 1, i);
		u = i - 1, v = i;
		if(h[u] > h[v]) u ^= v ^= u ^= v;
		if(lca == u){
			++dif[v];
			--dif[u];
		}else{
			++dif[u]; ++dif[v];
			dif[lca] -= 2;
		}
	}
	dfssolve(1);
	cout << ans;
	cerr << "ok\n";
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...