Submission #813106

#TimeUsernameProblemLanguageResultExecution timeMemory
813106vjudge1Putovanje (COCI20_putovanje)C++17
110 / 110
114 ms36604 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define pb push_back #define debug(x) cout << #x << ": " << (x) << endl #define eb emplace_back #define all(x) (x).begin(), (x).end() typedef long long ll; const int mxN = 2e5+5; const int mxM = 2e5+5; const int logN = 20; vector<pair<int, int>> g[mxN]; int tin[mxN]; int tout[mxN]; int up[mxN][logN]; int dfstime = 0; void dfs(int a, int p) { tin[a] = dfstime++; up[a][0] = p; for (int j = 1; j < logN; j++) { up[a][j] = up[ up[a][j-1] ][j-1]; } for (auto [b, idx]: g[a]) { if (b == p) continue; dfs(b, a); } tout[a] = dfstime; } bool is_ancestor(int a, int b) { return tin[a] <= tin[b] && tout[a] >= tout[b]; } int psum[mxN]; int get_lca(int a, int b) { if (is_ancestor(a, b)) { return a; } if (is_ancestor(b, a)) { return b; } for (int j = logN -1; j >= 0; j--) { if (!is_ancestor(up[a][j], b)) { a = up[a][j]; } } return up[a][0]; } int single[mxM]; int multi[mxM]; int used[mxM]; int dfs2(int a, int p) { int ans = 0; for (auto [b, idx]: g[a]) { if (b == p) continue; int t = dfs2(b, a); used[idx] = t; ans += t; } return ans + psum[a]; } void solve() { int n; cin >> n; for (int i = 0; i < n-1; i++) { int a, b, s, m; cin >> a >> b >> s >> m; a--; b--; single[i] = s; multi[i] = m; g[a].pb({b, i}); g[b].pb({a, i}); } dfs(0, 0); for (int a = 0; a < n-1; a++) { int b = a + 1; int lca = get_lca(a, b); psum[a]++; psum[b]++; psum[lca] -= 2; } dfs2(0, 0); int ans = 0; for (int i = 0; i < n-1; i++) { ans += min(multi[i], used[i]*single[i]); } cout << ans << endl; } int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t = 1; // cin >> t; while(t--) solve(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...