Submission #891449

#TimeUsernameProblemLanguageResultExecution timeMemory
891449Jawad_Akbar_JJSplit the Attractions (IOI19_split)C++17
0 / 100
71 ms31188 KiB
#include <iostream> #include <vector> #include <cstdio> #include <cassert> #include <algorithm> #include "split.h" using namespace std; const int N = (1<<18) + 1; vector<int> nei[N],ch[N]; int color[N],A,B; int sz[N],blocked = -1; bool seen[N],found = false; void color_it(int u,int c){ color[u] = c; A--; if (A == 0) return; for (int i : ch[u]){ if (blocked == i) continue; color_it(i,c); if (A==0) return; } } void dfs(int u){ seen[u] = true; sz[u] = 1; for (int i : nei[u]){ if (seen[i]) continue; ch[u].push_back(i); dfs(i); sz[u] += sz[i]; } } void dfs2(int u){ for (int i : ch[u]){ if (found) return; if (sz[i]>=A and (sz[1] - sz[i]) >= B){ color_it(i,1); A = B; blocked = i; color_it(1,2); found = true; return; } dfs2(i); } } vector<int> find_split(int n,int a,int b,int c,vector<int> p,vector<int> q){ int m = p.size(); for (int i=0;i<m;i++){ p[i]++; q[i]++; nei[p[i]].push_back(q[i]); nei[q[i]].push_back(p[i]); } dfs(1); vector<int> vv = {a,b,c}; sort(begin(vv),end(vv)); if (a==vv[0] and b==vv[1]) A = a,B = b; if (a==vv[0] and c==vv[1]) A = a,B = c; if (c==vv[0] and b==vv[1]) A = c,B = b; if (c==vv[0] and a==vv[1]) A = c,B = a; if (b==vv[0] and c==vv[1]) A = b,B = c; if (b==vv[0] and a==vv[1]) A = b,B = a; dfs2(1); vector<int> ans; for (int i=1;i<=n;i++){ if (found and color[i]==0) ans.push_back(3); else ans.push_back(color[i]); } 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...