Submission #1065377

#TimeUsernameProblemLanguageResultExecution timeMemory
1065377Gromp15Closing Time (IOI23_closing)C++17
0 / 100
82 ms56016 KiB
#include <bits/stdc++.h> #include "closing.h" #define ar array #define ll long long #define all(x) x.begin(), x.end() #define sz(x) (int)x.size() using namespace std; template<typename T> bool ckmin(T &a, const T &b) { return a > b ? a = b, 1 : 0; } template<typename T> bool ckmax(T &a, const T &b) { return a < b ? a = b, 1 : 0; } const ll INF = 1e18; int max_score(int n, int X, int Y, long long K, std::vector<int> U, std::vector<int> V, std::vector<int> W) { vector<vector<ar<int, 2>>> adj(n+1); for (int i = 0; i < n-1; i++) { adj[U[i]].push_back({V[i], W[i]}); adj[V[i]].push_back({U[i], W[i]}); } vector<vector<ll>> d(2, vector<ll>(n, INF)); vector<int> p(n, -1); auto dfs = [&](auto&& s, int v, vector<ll>& dist) -> void { for (auto [u, w] : adj[v]) if (u != p[v]) { p[u] = v, dist[u] = dist[v] + w; s(s, u, dist); } }; d[0][X] = 0, d[1][Y] = 0; dfs(dfs, X, d[0]); fill(all(p), -1); dfs(dfs, Y, d[1]); vector<int> pth; for (int x = X; x != Y; x = p[x]) pth.emplace_back(x); pth.emplace_back(Y); const int N = sz(pth); int ans = 0; for (int i = 0; i < 1; i++) { for (int j = N-1; j < N; j++) { vector<ll> dist(n); vector<int> who(n), allowed(n); for (int k = 0; k <= i; k++) { ckmax(dist[pth[k]], d[0][pth[k]]); who[pth[k]] |= 1; } for (int k = j; k < N; k++) { ckmax(dist[pth[k]], d[1][pth[k]]); who[pth[k]] |= 2; } ll used = 0; for (int v : pth) { used += dist[v]; if (used > K) break; } if (used > K) continue; set<ar<ll, 3>> q; set<ar<ll, 2>> q2; for (int v : pth) for (int z = 0; z < 2; z++) if (who[v] >> z & 1) { for (auto [u, w] : adj[v]) if (!(allowed[u] >> z & 1)) { allowed[u] |= 1 << z; if (allowed[u] == 3) q2.insert({max(d[0][u], d[1][u]), u}); q.insert({d[z][u], u, z}); } } while (q.size()) { auto [cost, v, k] = *q.begin(); assert(!(who[v] >> k & 1)); ll nxt = q.size() > 1 ? (*next(q.begin()))[0] : INF; if (i == 1 && j == 0) { //cout << "V " << v << " " << cost << " " << k << " " << nxt << " " << (q2.size() ? (*q2.begin())[0] : INF) << '\n'; } if (q2.size() && (*q2.begin())[0] <= cost + nxt) { //if (i == 1 && j == 0) cout << "HI " << (*q2.begin())[0] << " " << (*q2.begin())[1] << '\n'; auto [cost2, v2] = *q2.begin(); if (used + cost2 > K) { goto after; } q2.erase(q2.begin()); used += cost2; assert(!who[v2]); assert(allowed[v2] == 3); for (int i = 0; i < 2; i++) { assert(q.count({d[i][v2], v2, i})); q.erase({d[i][v2], v2, i}); } who[v2] = 3; for (auto [u, w] : adj[v2]) for (int z = 0; z < 2; z++) if (!(allowed[u] >> z & 1)) { allowed[u] |= 1 << z; if (allowed[u] == 3 && !who[u]) { q2.insert({max(d[0][u], d[1][u]), u}); } q.insert({d[z][u], u, z}); } continue; } after:; if (used + cost > K) break; //if (i == 1 && j == 0) cout << "USED " << v << '\n'; q.erase(q.begin()); used += cost; who[v] |= 1 << k; if (allowed[v] == 3 && q2.count({max(d[0][v], d[1][v]), v})) q2.erase({max(d[0][v], d[1][v]), v}); for (auto [u, w] : adj[v]) for (int z = 0; z < 2; z++) if ((who[v] >> z & 1) && !(allowed[u] >> z & 1)) { allowed[u] |= 1 << z; if (allowed[u] == 3 && !who[u]) q2.insert({max(d[0][u], d[1][u]), u}); q.insert({d[z][u], u, z}); } } int cur = 0; for (int x : who) cur += __builtin_popcount(x); ckmax(ans, cur); } } 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...