Submission #966018

#TimeUsernameProblemLanguageResultExecution timeMemory
96601842kangaroo봉쇄 시간 (IOI23_closing)C++17
43 / 100
128 ms44208 KiB
#include "closing.h" #include "bits/stdc++.h" #include <vector> #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]){ 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 (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); } int max_score2(int N, int X, int Y, long long K, std::vector<int> U, std::vector<int> V, std::vector<int> W) { using namespace std; if (X > Y) swap(X, Y); vector<ll> distX(N), distY(N); distX[X] = 0; for (int i = X + 1; i < N; ++i) { distX[i] = distX[i - 1] + W[i - 1]; } for (int i = X - 1; i >= 0; --i) { distX[i] = distX[i + 1] + W[i]; } distY[Y] = 0; for (int i = Y + 1; i < N; ++i) { distY[i] = distY[i - 1] + W[i - 1]; } for (int i = Y - 1; i >= 0; --i) { distY[i] = distY[i + 1] + W[i]; } int ma = 0; for (int i = 0; i <= X; ++i) { ll co = 0; for (int j = i; j < N; ++j) { co += distX[j]; if (j >= X) { int act = j - i + 1; if (co > K) continue; else { ll co2 = K - co; int lon = 0; int l = 0, r = Y; ll cos = 0; for (int k = 0; k < Y; ++k) { if (i <= k && k <= j && distX[k] > distY[k]); else if (i <= k && k <= j) cos += distY[k] - distX[k]; else cos += distY[k]; } while (l < Y && r < N) { while (l < Y && r < N && cos > co2) { if (i <= l && l <= j && distX[l] > distY[l]); else if (i <= l && l <= j) cos -= distY[l] - distX[l]; else cos -= distY[l]; l++; } while (r < N && cos <= co2) { lon = max(lon, r - l + 1); r++; if (r == N) break; if (i <= r && r <= j && distX[r] > distY[r]); else if (i <= r && r <= j) cos += distY[r] - distX[r]; else cos += distY[r]; } } act += lon; ma = max(ma, act); } } } } return ma; }
#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...