Submission #1240869

#TimeUsernameProblemLanguageResultExecution timeMemory
1240869banganClosing Time (IOI23_closing)C++20
0 / 100
1096 ms39236 KiB
#include "closing.h" #include <bits/stdc++.h> using namespace std; #define pb push_back #define eb emplace_back #define ALL(a) a.begin(), a.end() #define ll long long #define MP make_pair #define pii pair<int, int> const ll INF = 1ll << 50; int none(int N, int X, int Y, long long K, std::vector<int> U, std::vector<int> V, std::vector<int> W) { vector<vector<pii>> adj(N); for (int i=0; i < N-1; i++) { adj[V[i]].eb(U[i], W[i]); adj[U[i]].eb(V[i], W[i]); } vector<bool> done(N); vector<ll> d(N, INF); d[X] = d[Y] = 0; priority_queue<pii, vector<pii>, greater<pii>> pq; pq.emplace(0, X); pq.emplace(0, Y); int ans = 0; while (!pq.empty()) { auto [_, v] = pq.top(); pq.pop(); if (done[v]) continue; done[v] = true; if (d[v] <= K) { ans++; K -= d[v]; } for (auto [u, w] : adj[v]) if (d[v]+w < d[u]) { d[u] = d[v]+w; pq.push(MP(d[u], u)); } } return ans; } 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<pii>> adj(N); for (int i=0; i < N-1; i++) { adj[V[i]].eb(U[i], W[i]); adj[U[i]].eb(V[i], W[i]); } vector<array<ll, 2>> f(N); auto dfs = [&](auto self, int v, int p, int c) -> void { for (auto [u, w] : adj[v]) if (u!=p) { f[u][c] = f[v][c] + w; self(self, u, v, c); } }; dfs(dfs, X, X, 0); dfs(dfs, Y, Y, 1); int ret = none(N, X, Y, K, U, V, W); for (int l=0; l<N; l++) { ll sum_mx = 0; for (int r=l; r<N; r++) { sum_mx += max(f[r][0], f[r][1]); vector<int> L, R; for (int v=0; v<l && v<X; v++) L.pb(v); for (int v = N-1; r<v && Y<v; v--) R.pb(v); ll rem_k = K - sum_mx; if (X<l) rem_k -= f[l][0]; if (r<Y) rem_k -= f[r][1]; if (rem_k<0) continue; int ans = Y-X+1 + r-l+1; while (0<rem_k && !L.empty() && !R.empty()) { bool flg = false; if (!L.empty() && !R.empty()) { int v = L.back(); int u = R.back(); if (f[v][0]<f[u][1]) flg = true; } if (R.empty() || flg) { int v = L.back(); L.pop_back(); if (f[v][0]<=rem_k) rem_k -= f[v][0], ans++; } else { int v = R.back(); R.pop_back(); if (f[v][1]<=rem_k) rem_k -= f[v][1], ans++; } } ret = max(ret, ans); } } return ret; }
#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...