Submission #624741

#TimeUsernameProblemLanguageResultExecution timeMemory
624741MilosMilutinovicPutovanje (COCI20_putovanje)C++14
110 / 110
248 ms35516 KiB
/** * author: wxhtzdy * created: 08.08.2022 18:12:39 **/ #include <bits/stdc++.h> using namespace std; template <typename T> class fenwick { public: vector<T> fenw; int n; fenwick(int _n) : n(_n) { fenw.resize(n); } void modify(int x, T v) { while (x < n) { fenw[x] += v; x |= (x + 1); } } T get(int x) { T v{}; while (x >= 0) { v += fenw[x]; x = (x & (x + 1)) - 1; } return v; } }; int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin >> n; vector<vector<tuple<int, int, int>>> g(n); for (int i = 0; i < n - 1; i++) { int u, v, w0, w1; cin >> u >> v >> w0 >> w1; --u; --v; g[u].emplace_back(v, w0, w1); g[v].emplace_back(u, w0, w1); } vector<vector<int>> up(n, vector<int>(2)); vector<int> dep(n); vector<int> par(n); vector<int> tin(n); vector<int> tout(n); int T = 0; function<void(int, int)> Dfs = [&](int v, int pr) { tin[v] = ++T; par[v] = pr; dep[v] = dep[pr] + 1; for (auto& p : g[v]) { int u = get<0>(p); if (u != pr) { Dfs(u, v); up[u][0] = get<1>(p); up[u][1] = get<2>(p); } } tout[v] = T; }; Dfs(0, 0); const int L = 25; vector<vector<int>> jump(n, vector<int>(L)); for (int i = 0; i < n; i++) { jump[i][0] = par[i]; } for (int j = 1; j < L; j++) { for (int i = 0; i < n; i++) { jump[i][j] = jump[jump[i][j - 1]][j - 1]; } } auto LCA = [&](int u, int v) { if (dep[u] > dep[v]) { swap(u, v); } for (int i = L - 1; i >= 0; i--) { if (dep[jump[v][i]] >= dep[u]) { v = jump[v][i]; } } for (int i = L - 1; i >= 0; i--) { if (jump[u][i] != jump[v][i]) { u = jump[u][i]; v = jump[v][i]; } } return u == v ? u : jump[u][0]; }; fenwick<int> fenw(n + 1); auto Add = [&](int x, int y) { fenw.modify(tin[x], +1); fenw.modify(tin[y], -1); }; for (int i = 0; i < n - 1; i++) { int L = LCA(i, i + 1); Add(i, L); Add(i + 1, L); } long long ans = 0; for (int i = 1; i < n; i++) { ans += min(up[i][0] * 1LL * (fenw.get(tout[i]) - fenw.get(tin[i] - 1)), (long long) up[i][1]); } cout << ans << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...