Submission #1208655

#TimeUsernameProblemLanguageResultExecution timeMemory
1208655k1r1t0Road Closures (APIO21_roads)C++20
100 / 100
169 ms60360 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int N = 110000; struct fenwick { vector<ll> ff; vector<int> cc; int n; fenwick() {} fenwick(int n) { this->n = n; ff = vector<ll>(n + 1, 0); cc = vector<int>(n + 1, 0); } void upd(int k, ll x) { for (; k <= n; k += k & -k) { ff[k] += x; cc[k]++; } } ll _get(int k) { ll ans = 0; for (; k >= 1; k -= k & -k) ans += ff[k]; return ans; } ll get(int k) { int cnt = 0, pos = 0; for (int u = (1 << 20); u > 0; u /= 2) if (pos + u <= n && cnt + cc[pos + u] <= k) { pos += u; cnt += cc[pos]; } return _get(pos); } }; int n, k, sh[N]; ll dp[N][2]; set<array<int, 2>> vert, g[N]; fenwick ff[N]; vector<array<int, 2>> h[N]; bool bad[N], used[N]; void rem(int v, int u, int w) { int pos = lower_bound(begin(h[v]), end(h[v]), array<int, 2>{-w, u}) - begin(h[v]) + 1; sh[v]++; ff[v].upd(pos, w); } ll sum(int v, int t) { t = min(t, sh[v]); return ff[v].get(t); } ll dfs(int v, int p = -1) { used[v] = true; ll base = 0; vector<ll> add; for (auto [u, w] : g[v]) if (u != p) { dfs(u, v); dp[u][1] = max(dp[u][0], dp[u][1] + w); base += dp[u][0]; add.push_back(dp[u][1] - dp[u][0]); } sort(begin(add), end(add), greater<ll>()); for (int f = 0; f < 2; f++) { dp[v][f] = 0; ll addsum = 0; for (int a = 0; a <= min((int) add.size(), k - f); a++) { int b = k - f - a; dp[v][f] = max(dp[v][f], base + addsum + sum(v, b)); if (a < (int) add.size()) addsum += add[a]; } } return max(dp[v][0], dp[v][1]); } vector<ll> minimum_closure_costs(int N, vector<int> U, vector<int> V, vector<int> W) { n = N; for (int i = 0; i < n - 1; i++) { U[i]++; V[i]++; g[U[i]].insert({V[i], W[i]}); g[V[i]].insert({U[i], W[i]}); } for (int i = 1; i <= n; i++) { vector<array<int, 2>> ch; for (auto [u, w] : g[i]) h[i].push_back({-w, u}); sort(begin(h[i]), end(h[i])); ff[i] = fenwick((int) g[i].size()); vert.insert({(int) g[i].size(), i}); } ll base = 0; vector<ll> ans; for (k = 0; k <= n - 1; k++) { while (!vert.empty() && (*vert.begin())[0] <= k) { int v = (*vert.begin())[1]; vert.erase(vert.begin()); bad[v] = true; for (auto [u, w] : g[v]) { g[u].erase({v, w}); rem(u, v, w); } base += sum(v, sh[v]); } if (k == 0) ans.push_back(0); else { ll cur = base; for (auto [s, v] : vert) used[v] = false; for (auto [s, v] : vert) if (!used[v]) cur += dfs(v); ans.push_back(cur); } } ll sum = accumulate(begin(W), end(W), 0ll); for (ll &x : ans) x = sum - x; return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...