Submission #913859

#TimeUsernameProblemLanguageResultExecution timeMemory
913859abcvuitunggioClosing Time (IOI23_closing)C++17
75 / 100
1050 ms48736 KiB
#include "closing.h" #include <bits/stdc++.h> using namespace std; vector <pair <int, int>> ke[200001]; long long d[200001][2],cur; int p[200001],ch[200001],vis[200001],inset[200001]; set <pair <long long, int>> s,s2; void dfs(int u, int i, int par=-1){ for (auto [v,w]:ke[u]) if (v!=par){ d[v][i]=d[u][i]+w; p[v]=u; dfs(v,i,u); } } void dfs2(int u, int par){ for (auto [v,w]:ke[u]){ if (!ch[v]&&v!=par){ if (!vis[v]&&min(d[v][0],d[v][1])*2>max(d[v][0],d[v][1])){ s2.insert({max(d[v][0],d[v][1]),v}); inset[v]=1; } dfs2(v,u); } } } int f(int N, long long K, int b, int b2){ cur=0; int cnt=0; for (int i=0;i<N;i++){ vis[i]=inset[i]=0; if (min(d[i][0],d[i][1])>K) continue; if (ch[i]){ s.insert({abs(d[i][0]-d[i][1]),i}); cur+=min(d[i][0],d[i][1]); cnt++; } else{ s.insert({min(d[i][0],d[i][1]),i}); if (min(d[i][0],d[i][1])*2<=max(d[i][0],d[i][1])) s.insert({abs(d[i][0]-d[i][1]),i}); } } while (!s.empty()){ int i=0,y=0; long long x=0; auto [c,u]=*s.begin(); s.erase(s.begin()); if (s2.empty()) x=c,i=u,y=1; else{ auto [c2,u2]=*s2.begin(); s2.erase(s2.begin()); if (s.empty()){ s.insert({c,u}); x=c2; i=u2; y=2; } else{ bool ch=0; if (b2) ch=(c+(*s.begin()).first<c2||(c+(*s.begin()).first==c2&&b)); else ch=c>c2; if (u!=u2&&ch){ s2.insert({c2,u2}); x=c; i=u; y=1; } else{ s.insert({c,u}); x=c2; i=u2; y=2; } } } if (cur+x>K) break; cur+=x; cnt+=y; if (y==1&&!vis[i]){ if (ch[i]) dfs2(i,i); else{ s.insert({abs(d[i][0]-d[i][1]),i}); if (inset[i]) s2.erase(s2.find({max(d[i][0],d[i][1]),i})); } } if (y==2&&!vis[i]) s.erase(s.find({min(d[i][0],d[i][1]),i})); vis[i]=1; } while (!s.empty()&&cur+(*s.begin()).first<=K){ cur+=(*s.begin()).first; cnt++; s.erase(s.begin()); } while (!s2.empty()&&cur+(*s2.begin()).first<=K){ cur+=(*s2.begin()).first; cnt+=2; s2.erase(s2.begin()); } s.clear(); s2.clear(); return (cur>K?0:cnt); } int max_score(int N, int X, int Y, long long K, vector<int> U, vector<int> V, vector<int> W){ for (int i=0;i<N-1;i++){ ke[U[i]].push_back({V[i],W[i]}); ke[V[i]].push_back({U[i],W[i]}); } fill(ch,ch+N,0); d[X][0]=d[Y][1]=0; dfs(X,0); dfs(Y,1); for (;X!=Y;X=p[X]) ch[X]=1; ch[Y]=1; int res=0; for (int i=0;i<N;i++) s.insert({min(d[i][0],d[i][1]),i}); cur=0; while (!s.empty()&&cur+(*s.begin()).first<=K){ cur+=(*s.begin()).first; res++; s.erase(s.begin()); } s.clear(); for (int i=0;i<2;i++) for (int j=0;j<2;j++) res=max(res,f(N,K,i,j)); for (int i=0;i<N;i++) ke[i].clear(); 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...