Submission #847514

#TimeUsernameProblemLanguageResultExecution timeMemory
847514nvmdavaClosing Time (IOI23_closing)C++17
83 / 100
1062 ms37968 KiB
#include "closing.h" #include <bits/stdc++.h> using namespace std; #define ll long long const int N = 200'005; vector<pair<int, ll> > adj[N]; ll dx[N]; int px[N]; int py[N]; ll dy[N]; ll d[N]; int p[N]; void dfs(int v, int par) { p[v] = par; for(auto& u : adj[v]) { if(u.first == par) continue; d[u.first] = u.second + d[v]; dfs(u.first, v); } } int max_score(int n, int X, int Y, long long k, std::vector<int> U, std::vector<int> V, std::vector<int> W) { multiset<ll> q, w; // q - solo, w - double vector<pair<ll, ll> > help; for(int i = 0; i < n; ++i){ d[i] = dx[i] = dy[i] = p[i] = px[i] = py[i] = 0; adj[i].clear(); } 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]}); } dfs(X, -1); swap(d, dx); swap(p, px); dfs(Y, -1); swap(d, dy); swap(p, py); int res = 0; vector<ll> dd(n); for(int i = 0; i < n; ++i) dd[i] = min(dx[i], dy[i]); sort(dd.begin(), dd.end()); ll tmp = k; for(int i = 0; i < n; ++i) { tmp -= dd[i]; if(tmp >= 0) res = i + 1; else break; } int cur = 0; ll sum = 0; for(int i = 0; i < n; ++i) { if(dx[i] + dy[i] == dx[Y]) { sum += min(dx[i], dy[i]); ++cur; q.insert(abs(dx[i] - dy[i])); if(sum > k) return res; } else { help.push_back({min(dx[i], dy[i]), abs(dx[i] - dy[i])}); q.insert(min(dx[i], dy[i])); } } sort(help.begin(), help.end(), [](const pair<ll, ll>& lhs, const pair<ll, ll>& rhs) { return lhs.second == rhs.second ? lhs.first < rhs.first : lhs.second < rhs.second; }); auto qit = q.begin(); auto wit = w.begin(); while(qit != q.end() && sum + *qit <= k) { ++cur; sum += *qit; ++qit; } res = max(res, cur); for(auto& e : help) { e.second += e.first; if(wit == w.end() || *wit > e.second) { cur += 2; sum += e.second; } w.insert(e.second); auto fin = q.find(e.first); if(qit == q.end() || *qit >= e.first) { cur -= 1; sum -= e.first; } if(qit == fin) { cur += 1; sum += e.first; ++qit; } q.erase(fin); if(sum > k) { --wit; sum -= *wit; cur -= 2; } bool reb; if(qit != q.end() && sum + *qit <= k) { sum += *qit; cur += 1; qit++; reb = 1; } do { reb = 0; while(wit != w.end() && sum + *wit <= k) { sum += *wit; cur += 2; wit++; reb = 1; } if(wit != w.end() && qit != q.begin()) { auto q1 = qit; q1--; if(q1 != q.begin()){ auto q2 = q1; q2--; if(*q1 + *q2 > *wit) { sum += *wit - *q1 - *q2; ++wit; --qit; --qit; reb = 1; continue; } } if(sum - *q1 + *wit <= k) { sum += *wit - *q1; ++cur; --qit; ++wit; reb = 1; continue; } } } while(reb); res = max(res, cur); } return res; }
#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...