Submission #1153548

#TimeUsernameProblemLanguageResultExecution timeMemory
1153548siewjhClosing Time (IOI23_closing)C++20
100 / 100
217 ms47064 KiB
#include "closing.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN = 200005; const ll inf = 2e18; vector<pair<int, ll>> adj[MAXN]; ll dx[MAXN], dy[MAXN], d1[MAXN], d2[MAXN], ss[MAXN << 1], sd[MAXN << 1]; void dfs(int x, int par, ll dist, ll *darr){ darr[x] = dist; for (auto [nn, nd] : adj[x]){ if (nn == par) continue; dfs(nn, x, dist + nd, darr); } } int max_score(int N, int X, int Y, ll K, vector<int> U, vector<int> V, vector<int> W){ for (int i = 0; i < N; i++) adj[i].clear(); for (int i = 0; i < N - 1; i++){ int u = U[i], v = V[i], w = W[i]; adj[u].push_back({v, w}); adj[v].push_back({u, w}); } dfs(X, -1, 0, dx); dfs(Y, -1, 0, dy); for (int i = 0; i < N; i++){ d1[i] = min(dx[i], dy[i]); d2[i] = max(dx[i], dy[i]) - d1[i]; } int ans1 = 0, ans2 = 0; ll cap = K; vector<ll> vl1(N); for (int i = 0; i < N; i++) vl1[i] = d1[i]; sort(vl1.begin(), vl1.end()); for (ll c : vl1){ if (cap < c) break; cap -= c; ans1++; } cap = K; vector<ll> vs; vector<pair<ll, int>> vd; set<pair<ll, int>> reg; for (int i = 0; i < N; i++){ if (dx[i] + dy[i] == dx[Y]){ cap -= d1[i]; ans2++; vs.push_back(d2[i]); } else if (d1[i] > d2[i]){ vd.push_back({d1[i] + d2[i], i}); reg.insert({d1[i], i}); } else{ vs.push_back(d1[i]); vs.push_back(d2[i]); } } if (cap >= 0){ sort(vs.begin(), vs.end()); sort(vd.begin(), vd.end()); int ssz = vs.size(), dsz = vd.size(); ss[0] = 0; for (int i = 0; i < ssz; i++) ss[i + 1] = ss[i] + vs[i]; ll sub = 0; sd[0] = 0; for (int i = 0; i < dsz; i++){ ll c; int id; tie(c, id) = vd[i]; ll r1a2 = c - sub, a1 = inf; if (!reg.empty()) a1 = reg.begin()->first; sd[(i << 1) + 1] = sd[i << 1] + min(r1a2, a1); sd[(i << 1) + 2] = sd[i << 1] + c; sub = max(sub, d2[id]); reg.erase({d1[id], id}); } int res = 0; for (int si = 0, di = (dsz << 1); si <= ssz; si++){ while (di > 0 && ss[si] + sd[di] > cap) di--; if (ss[si] + sd[di] > cap) break; res = max(res, si + di); } ans2 += res; } else ans2 = 0; return max(ans1, ans2); }
#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...