Submission #1241477

#TimeUsernameProblemLanguageResultExecution timeMemory
1241477vako_pClosing Time (IOI23_closing)C++20
35 / 100
1092 ms47956 KiB
#include "closing.h" #include <bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define ff first #define sd second #define debug(x) cerr << #x << "----> " << x << endl; //#pragma GCC optimize("unroll-loops") //#pragma GCC optimize("Ofast") //#pragma GCC optimize("O3") const int mxN = 3e5 + 5; ll n,dis[mxN],dis1[mxN],dis2[mxN]; vector<pair<ll,ll>> v[mxN]; vector<ll> vv; void dfs(ll at, ll par, bool ok = false){ if(ok) vv.pb(at); for(auto it : v[at]){ if(it.ff == par) continue; dis[it.ff] = dis[at] + it.sd; dfs(it.ff, at, ok); } } int max_score(int N, int X, int Y, long long K, std::vector<int> U, std::vector<int> V, std::vector<int> W){ n = N; for(int i = 0; i < n - 1; i++){ v[U[i]].pb({V[i], W[i]}); v[V[i]].pb({U[i], W[i]}); } ll root = 0; for(int i = 0; i < n; i++) if(v[i].size() == 1){ root = i; break; } dis[root] = 0; vv.clear(); dfs(root, root, true); int x,y; for(int i = 0; i < n; i++){ if(vv[i] == X) x = i; if(vv[i] == Y) y = i; } if(x > y) swap(x, y); dis[X] = 0; dfs(X, X); for(int i = 0; i < n; i++) dis1[i] = dis[vv[i]]; dis[Y] = 0; dfs(Y, Y); for(int i = 0; i < n; i++) dis2[i] = dis[i]; for(int i = 0; i < n; i++) dis[i] = dis2[vv[i]]; ll sum = 0,ans = 0; vector<ll> v2; for(int i = 0; i < n; i++){ v2.pb(dis[i]); v2.pb(dis1[i]); } sort(v2.begin(), v2.end()); for(auto it : v2){ sum += it; if(sum > K) break; ans++; } for(int l = 0; l <= y; l++){ vector<pair<ll,pair<ll,ll>>> ss; stack<pair<ll,pair<ll,ll>>> s1,st; sum = 0; ll ans1 = 2 * max(1, x - l + 1),sum1 = 0; for(int i = 0; i < l; i++){ ss.pb({dis[i], {0, i}}); // sum1 += dis[i]; } for(int i = y + 1; i < n; i++){ ss.pb({dis[i], {0, i}}); // sum1 += dis[i]; } for(int i = 0; i < min(x, l); i++){ ss.pb({dis1[i], {1, i}}); // sum1 += dis1[i]; } for(int i = max(l, x) + 1; i < n; i++){ if(i <= y){ ans1++; sum += dis[i]; } // sum1 += dis1[i]; ss.pb({dis1[i], {1, i}}); } for(int i = x; i < l; i++){ ans1++; sum += dis1[i]; } for(int i = l; i <= max(l, x); i++) sum += max(dis[i], dis1[i]); if(sum > K) continue; ll idx = 0; sort(ss.begin(), ss.end()); vector<vector<bool>> vis(n, vector<bool>(2, false)); ll curr = 0; for(int i = 0; i < ss.size(); i++){ if(sum + sum1 + ss[i].ff <= K){ sum1 += ss[i].ff; vis[ss[i].sd.sd][ss[i].sd.ff] = true; st.push(ss[i]); } else{ idx = i; break; } } if(ss.size()) for(int i = ss.size() - 1; i >= idx; i--){ s1.push(ss[i]); } // while(sum + sum1 > K){ // auto it = ss.end(); --it; // s1.push(*it); // sum1 -= (*it).ff; // ss.erase(it); // } ans = max(ans, ans1 + (ll)st.size()); for(int r = max(l, x) + 1; r < n; r++){ // auto it = s.find({dis[r], 0}),it1 = s.find({dis1[r], 1}); if(vis[r][0]){ sum1 -= dis[r]; curr++; vis[r][0] = false; // s.erase(it); } if(vis[r][1]){ sum1 -= dis1[r]; curr++; vis[r][1] = false; // s.erase(it1); } if(r <= y){ sum -= dis[r]; ans1--; } ans1 += 2; sum += max(dis[r], dis1[r]); if(sum > K) break; while(sum + sum1 > K){ pair<ll,pair<ll,ll>> it2 = st.top(); st.pop(); if(!vis[it2.sd.sd][it2.sd.ff]){ curr--; continue; } vis[it2.sd.sd][it2.sd.ff] = false; s1.push(it2); sum1 -= it2.ff; // s.erase(it2); } while(s1.size()){ auto it2 = s1.top(); if(it2.ff + sum1 + sum > K) break; sum1 += it2.ff; st.push(it2); vis[it2.sd.sd][it2.sd.ff] = true; s1.pop(); } ans = max(ans, ans1 + (ll)st.size() - curr); } } for(int i = 0; i < n; i++) v[i].clear(); // cout << "aa" << endl; return ans; } //1 //6 0 3 10 //5 3 5 //3 1 2 //1 2 1 //2 0 3 //0 4 7
#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...