Submission #1160452

#TimeUsernameProblemLanguageResultExecution timeMemory
1160452kl0989eClosing Time (IOI23_closing)C++20
43 / 100
80 ms30532 KiB
#include "closing.h" #include <bits/stdc++.h> using namespace std; #define ll long long #define pi pair<int, int> #define pl pair<ll, ll> #define vi vector<int> #define vl vector<ll> #define fi first #define se second #define pb push_back #define all(x) (x).begin(),(x).end() const int maxn=2e5+10; vector<vector<pi>> graph(maxn); vl vala(maxn,0); vl valb(maxn,0); vl val_cur(maxn,0); vi prev_a(maxn,-1); vi prev_b(maxn,-1); vi seen(maxn,0); void dfs(int cur, int prev=-1, ll dist=0) { prev_a[cur]=prev; vala[cur]=dist; for (auto [to,add]:graph[cur]) { if (to!=prev) { dfs(to,cur,dist+add); } } } int max_score(int n, int x, int y, long long k, vi u, vi v, vi w) { for (int i=0; i<n; i++) { graph[i].clear(); vala[i]=valb[i]=val_cur[i]=0; prev_a[i]=prev_b[i]=-1; seen[i]=0; } for (int i=0; i<n-1; i++) { graph[u[i]].pb({v[i],w[i]}); graph[v[i]].pb({u[i],w[i]}); } dfs(y); swap(vala,valb); swap(prev_a,prev_b); dfs(x); set<array<ll,3>> qa={{0,valb[x],x},{(ll)(2e18+1),0,-1}},qb={{0,vala[y],y},{(ll)(2e18+1),0,-1}}; int ans=0; while (min((*qa.begin())[0],(*qb.begin())[0])<=k) { ans++; if ((*qa.begin())[0]<(*qb.begin())[0] || ((*qa.begin())[0]==(*qb.begin())[0] && (*qa.begin())[1]<=(*qb.begin())[1])) { auto temp=*qa.begin(); ll val=temp[0],_=temp[1],cur=temp[2]; seen[cur]=1; qa.erase(qa.begin()); val_cur[cur]+=val; k-=val; for (auto [to,add]:graph[cur]) { if (to!=prev_a[cur]) { qa.insert({vala[to]-val_cur[to],(seen[to]?(ll)(2e18+1):valb[to]),to}); } } if (qb.count({valb[cur],vala[cur],cur})) { qb.erase({valb[cur],vala[cur],cur}); qb.insert({valb[cur]-val_cur[cur],(ll)(2e18+1),cur}); } } else { auto temp=*qb.begin(); ll val=temp[0],_=temp[1],cur=temp[2]; seen[cur]=1; qb.erase(qb.begin()); val_cur[cur]+=val; k-=val; for (auto [to,add]:graph[cur]) { if (to!=prev_b[cur]) { qb.insert({valb[to]-val_cur[to],(seen[to]?(ll)(2e18+1):vala[to]),to}); } } if (qa.count({vala[cur],valb[cur],cur})) { qa.erase({vala[cur],valb[cur],cur}); qa.insert({vala[cur]-val_cur[cur],(ll)(2e18+1),cur}); } } } 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...