Submission #1180444

#TimeUsernameProblemLanguageResultExecution timeMemory
1180444euthymia2606Putovanje (COCI20_putovanje)C++20
110 / 110
70 ms22200 KiB
#include <bits/stdc++.h> 

using namespace std;  

typedef long long ll;  
typedef pair<int, int> ii;  

const int INF = 1e9;  
const ll LINF = 1e18;  

const int N = 2e5 + 5;  

struct AdjEdge {
	int to, id;  
}; 

struct Edge {
	int c1, c2;  
}; 

int n;  
vector<AdjEdge> adj[N];  
vector<Edge> edges; 

int up[18][N]; 
int tin[N], tout[N], timer;   
int edge_to_node[N]; 

void dfs1(int u, int p) {
	tin[u] = ++timer;   
	up[0][u] = p;   
	for (int i = 1; i <= 17; i++) {
		up[i][u] = up[i - 1][up[i - 1][u]]; 
	}
	for (auto e : adj[u]) {
		int v = e.to, id = e.id;
		if (v == p) continue;  
		edge_to_node[id] = v;   
		dfs1(v, u); 
	}
	tout[u] = timer; 
}

bool isAncestor(int u, int v) {
	return (tin[u] <= tin[v] && tout[v] <= tout[u]); 
}

int lca(int u, int v) {
	if (isAncestor(u, v)) return u;  
	if (isAncestor(v, u)) return v;   
	for (int i = 17; i >= 0; i--) {
		if (!isAncestor(up[i][u], v)) {
			u = up[i][u]; 
		}
	}
	return up[0][u]; 
}

int sum[N]; 

void dfs2(int u, int p) {
	for (auto e : adj[u]) {
		int v = e.to; 
		if (v == p) continue; 
		dfs2(v, u);  
		sum[u] += sum[v]; 
	}
}

int main() {
	ios::sync_with_stdio(false); 
	cin.tie(nullptr); 	
	cin >> n; 
	for (int i = 0; i < n - 1; i++) {
		int u, v, c1, c2; 
		cin >> u >> v >> c1 >> c2;  
		adj[u].push_back({v, i}); 
		adj[v].push_back({u, i});
		edges.push_back({c1, c2});  
	}

	timer = 0;   
	dfs1(1, 1); 

	for (int u = 1; u + 1 <= n; u++) {
		int v = u + 1;  
		sum[u]++; 
		sum[v]++; 
		sum[lca(u, v)] -= 2;  
	}

	dfs2(1, 1); 

	ll ans = 0;  
	for (int i = 0; i < n - 1; i++) {
		ll c1 = edges[i].c1, c2 = edges[i].c2; 
		int u = edge_to_node[i]; 
		ans += min(sum[u] * c1, c2); 
	}

	cout << ans << '\n'; 
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...