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...