Submission #960395

#TimeUsernameProblemLanguageResultExecution timeMemory
960395Prieved1Closing Time (IOI23_closing)C++17
8 / 100
118 ms43380 KiB
#include "closing.h" #include <bits/stdc++.h> using namespace std; const int MAXN=200010; vector<pair<int,int>> g[MAXN]; long long distX[MAXN], distY[MAXN]; int dp[MAXN]; vector<int> path; void dfsx(int at, int p) { for(auto [to,w]:g[at]) { if(to==p)continue; distX[to]=distX[at]+w; dfsx(to, at); } } void dfsy(int at, int p) { for(auto [to,w]:g[at]) { if(to==p)continue; distY[to]=distY[at]+w; dfsy(to, at); dp[at]|=dp[to]; } if(dp[at])path.push_back(at); } int max_score(int N, int X, int Y, long long K, std::vector<int> U, std::vector<int> V, std::vector<int> W) { for(int i = 0;i<N-1;i++) { g[U[i]].push_back({V[i], W[i]}); g[V[i]].push_back({U[i], W[i]}); } dp[X]=1; dfsx(X, -1); dfsy(Y, -1); int ans=0; // case 1 { int cnt=0; priority_queue<long long> pq; for(int i = 0;i<N;i++) { pq.push(-distX[i]); pq.push(-distY[i]); } long long sum=0; while(sum<=K and pq.size()) { sum-=pq.top(); cnt++; pq.pop(); if(sum<=K)ans=max(ans,cnt); } } // case 2 { long long sum=0; int cnt=0; priority_queue<pair<long long,long long>> pq; multiset<long long> ms; for(int i = 0;i<N;i++) { if(distX[i]>distY[i])swap(distX[i], distY[i]); distY[i]-=distX[i]; } int upd[N]; memset(upd, 0, sizeof upd); for(int i:path) { sum+=distX[i]; upd[i]++; cnt++; } for(int i = 0;i<N;i++) { if(upd[i]==1) { pq.push({-2*distY[i], -1}); continue; } if(distX[i]>distY[i]) { pq.push({-distY[i]-distX[i], -distX[i]-2}); ms.insert(distX[i]); } else { pq.push({-2*distX[i], distY[i]}); } } while(pq.size() and sum<=K) { auto at=pq.top(); pq.pop(); at.first*=-1; if(at.second == -1 or at.second>=0) { at.first/=2; if(sum+at.first<=K) { sum+=at.first; if(at.second>=0) { pq.push({-2*at.second, -1}); } cnt++; } else break; } else { at.second+=2; at.first*=2; at.second*=-1; if(sum+at.first<=K) { sum+=at.first; cnt+=2; ms.erase(ms.find(at.second)); } else continue; } ans=max(ans, cnt); if(ms.size() and sum+(*ms.begin())<=K)ans=max(ans, cnt+1); } } for(int i = 0;i<=N;i++) { dp[i]=0; distX[i]=distY[i]=0; g[i].clear(); } path.clear(); 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...