Submission #821497

#TimeUsernameProblemLanguageResultExecution timeMemory
821497BaytoroSplit the Attractions (IOI19_split)C++17
18 / 100
426 ms1048576 KiB
#include "split.h" //#include "grader.cpp" #include <bits/stdc++.h> using namespace std; const int maxN=1e5+5; vector<int> ans,g[maxN]; int used[maxN]; void dfs(int x, int &d, int c){ if(d<=0) return; ans[x]=c; used[x]=1; for(auto it: g[x]){ if(used[it]) continue; dfs(it,--d,c); } } int sz[maxN]; int N; int A,B,C; int u=-1,v=-1; void DFS(int x, int p){ sz[x]=1; for(auto it: g[x]){ if(it==p) continue; DFS(it,x); if(sz[it]>=A && N-sz[it]>=B) u=x,v=it; sz[x]+=sz[it]; } } void col(int x, int p, int c){ ans[x]=c; for(auto it: g[x]){ if(it==p) continue; col(it,x,c); } } vector<int> find_split(int n, int a, int b, int c, vector<int> p, vector<int> q) { N=n;int m=p.size(); ans.resize(n); A=a,B=b,C=c; if(A>B) swap(A,B); if(B>C) swap(B,C); if(A>B) swap(A,B); bool ok=1,sb1=1; for(int i=0;i<m;i++){ g[p[i]].push_back(q[i]); g[q[i]].push_back(p[i]); if(g[p[i]].size()>2) sb1=0; if(g[q[i]].size()>2) sb1=0; } if(sb1){ for(int i=0;i<n;i++){ if(g[i].size()==1 && ok){ dfs(i,b,2); ok=0; } else if(g[i].size()==1 && !ok){ dfs(i,a,1); break; } } if(ok){ dfs(0,b,2); for(int i=0;i<n;i++){ if(!used[i]){ dfs(i,a,1); break; } } } for(int i=0;i<n;i++){ if(!ans[i]) ans[i]=3; } return ans; } else if(a==1){ dfs(0,b,2); bool ok=0; for(int i=0;i<n;i++){ if(ans[i]) continue; ans[i]=3; if(!ok) ans[i]=1; ok=1; } return ans; } else{ int x,y; if(A==a){ x=1; if(B==b) y=2; else y=3; } else if(A==B){ x=2; if(B==a) y=1; else y=3; } else{ x=3; if(B==a) y=1; else y=2; } DFS(0,0); if(u==-1) return ans; col(v,u,x); for(int i=0;i<n;i++){ if(!ans[i]) ans[i]=y; } 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...