Submission #538297

#TimeUsernameProblemLanguageResultExecution timeMemory
538297jamezzzSplit the Attractions (IOI19_split)C++17
40 / 100
198 ms24936 KiB
#include "split.h" #include <bits/stdc++.h> using namespace std; #define sf scanf #define pf printf #define fi first #define se second #define pb push_back #define sz(x) (int)x.size() #define all(x) x.begin(),x.end() typedef pair<int,int> ii; #define maxn 100005 int a,b,c,rem,col,mark[3],sub[maxn],s1,s2,cut,flag[maxn],vis[maxn]; bool backedge[maxn]; vector<int> res; vector<int> AL[maxn]; vector<ii> x; set<int> s,st1,st2; void dfs(int u,int p){ sub[u]=1; for(int v:AL[u]){ if(sub[v]!=0)continue; dfs(v,u); sub[u]+=sub[v]; } } void dfs2(int u,int p,int f=0){ vis[u]=true; for(int v:AL[u]){ if(v==p)continue; if(!f&&sub[v]>sub[cut]){//back edge if(s1-sub[u]>=a){ s1-=sub[u]; s2+=sub[u]; flag[u]=1; dfs2(v,u,1); } return; } if(vis[v])continue; dfs2(v,u,f); } } void dfs3(int u,int oflag){ vis[u]=true; if(flag[u]!=-1)oflag=flag[u]; if(oflag==0)st1.insert(u); else st2.insert(u); for(int v:AL[u]){ if(vis[v])continue; dfs3(v,oflag); } } void dfs4(int u,int f){ //pf("dfs4: %d %d %d\n",u,rem,f); if(rem==0)return; --rem;res[u]=f; for(int v:AL[u]){ if(s.find(v)==s.end())continue; if(res[v]!=0)continue; dfs4(v,f); } } vector<int> find_split(int n,int _a,int _b,int _c,vector<int> p,vector<int> q){ a=_a;b=_b;c=_c; x.pb({a,1});x.pb({b,2});x.pb({c,3}); sort(all(x)); //for(ii pr:x)pf("(%d %d) ",pr.fi,pr.se);pf("\n"); for(int i=0;i<3;++i)mark[i]=x[i].se; tie(a,b,c)={x[0].fi,x[1].fi,x[2].fi}; res.resize(n); for(int i=0;i<sz(p);++i){ AL[p[i]].pb(q[i]); AL[q[i]].pb(p[i]); } dfs(0,-1); //for(int i=0;i<n;++i)pf("%d ",sub[i]);pf("\n"); cut=-1; for(int u=0;u<n;++u){ bool can=true; if(sub[u]<a)can=false; for(int v:AL[u]){ if(sub[v]<sub[u]&&sub[v]>=a)can=false; } if(can){ cut=u;break; } } //pf("%d\n",cut); s1=sub[cut],s2=n-sub[cut]; memset(flag,-1,sizeof flag); dfs2(cut,-1); flag[cut]=0; memset(vis,0,sizeof vis); dfs3(0,1); if(sz(st2)<a)return res; if(sz(st1)>b)swap(st1,st2); //for(int i:st1)pf("%d ",i);pf("\n"); //for(int i:st2)pf("%d ",i);pf("\n"); s=st1;rem=a; dfs4(*st1.begin(),x[0].se); s=st2;rem=b; dfs4(*st2.begin(),x[1].se); for(int i=0;i<n;++i)if(res[i]==0)res[i]=x[2].se; 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...