Submission #1041908

#TimeUsernameProblemLanguageResultExecution timeMemory
104190842kangarooClosing Time (IOI23_closing)C++17
43 / 100
86 ms46264 KiB
#include "closing.h" #include "bits/stdc++.h" #define ll long long using namespace std; struct Ed { ll to, w; }; bool operator<(const Ed &l, const Ed &r) { return l.w > r.w; } using g_t = vector<vector<Ed>>; void diDfs(int n, ll d, g_t &g, vector<ll> &di) { if (di[n] != -1) return; di[n] = d; for (auto e: g[n]) { diDfs(e.to, d + e.w, g, di); } } void maG(int n, int p, bool com, g_t &g, g_t &nG, vector<bool> &ma, array<vector<ll>, 2> &di, vector<int> &inD) { if (!ma[n]) { if (di[com][p] == 0) { nG.back().push_back({n, di[com][n]}); inD[n]++; } else if (di[com][n] < di[!com][n] || (di[com][n] == di[!com][n] && com)) { nG[p].push_back({n, di[com][n]}); inD[n]++; } else { nG[n].push_back({n + (int) g.size(), di[com][n] - di[!com][n]}); nG[p + g.size()].push_back({n + (int) g.size(), di[com][n] - di[!com][n]}); inD[n + g.size()] += 2; } } else if (ma[n] && di[com][n] > di[!com][n]) { if (di[com][p] <= di[!com][p]) { nG.back().push_back({n + (int) g.size(), di[com][n] - di[!com][n]}); inD[n + g.size()]++; } else { nG[p + g.size()].push_back({n + (int) g.size(), di[com][n] - di[!com][n]}); inD[n + g.size()]++; } } for (auto e: g[n]) { if (e.to == p) continue; maG(e.to, n, com, g, nG, ma, di, inD); } } bool markdfs(int n, int p, int y, g_t &g, vector<bool> &ma) { if (n == y) return ma[n] = true; for (auto e: g[n]) { if (e.to == p) continue; if (markdfs(e.to, n, y, g, ma)) return ma[n] = true; } return false; } int max_score(int N, int X, int Y, long long K, std::vector<int> U, std::vector<int> V, std::vector<int> W) { g_t g(N); for (int i = 0; i < N - 1; ++i) { g[U[i]].push_back({V[i], W[i]}); g[V[i]].push_back({U[i], W[i]}); } array<vector<ll>, 2> dist; dist.fill(vector<ll>(N, -1)); diDfs(X, 0, g, dist[0]); diDfs(Y, 0, g, dist[1]); int nuWithout = 0; vector<bool> vis(N, false); priority_queue<pair<Ed, bool>> q; q.push({{X, 0}, false}); q.push({{Y, 0}, true}); ll kC = K; while (!q.empty()) { auto [ed, com] = q.top(); q.pop(); if (vis[ed.to]) continue; if (kC < ed.w) break; kC -= ed.w; nuWithout++; vis[ed.to] = true; for (auto e: g[ed.to]) { q.push({{e.to, dist[com][e.to]}, com}); } } vector<bool> ma(N, false); markdfs(X, X, Y, g, ma); int nuW = 0; g_t nG(2 * N + 1); for (int i = 0; i < N; ++i) { if (ma[i]) { K -= min(dist[0][i], dist[1][i]); nuW++; if (dist[0][i] == dist[1][i]) nuW++; } } if (K < 0) return nuWithout; vector<int> inD(2 * N); maG(X, X, false, g, nG, ma, dist, inD); maG(Y, Y, true, g, nG, ma, dist, inD); q.push({{2 * N, 0}, false}); while (!q.empty()) { auto [ed, com] = q.top(); q.pop(); if (K < ed.w) break; K -= ed.w; if (com) nuW++; for (auto e: nG[ed.to]) { if (--inD[e.to] == 0) { q.push({e, true}); } } } return max(nuW, nuWithout); }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...