Submission #774509

#TimeUsernameProblemLanguageResultExecution timeMemory
774509Jarif_RahmanSplit the Attractions (IOI19_split)C++17
40 / 100
70 ms28876 KiB
#include <bits/stdc++.h> #define pb push_back #define f first #define sc second using namespace std; typedef long long int ll; typedef string str; int n, m; vector<int> s, so; vector<vector<int>> graph; vector<vector<int>> dfs_tree; vector<int> depth, mnd; vector<bool> visited; vector<int> sz; void dfs(int nd, int mom, int d = 0){ visited[nd] = 1; depth[nd] = d, mnd[nd] = d; for(int x: graph[nd]) if(x != mom && !visited[x]) dfs(x, nd, d+1), sz[nd]+=sz[x]; for(int x: graph[nd]) if(visited[x]) mnd[nd] = min(mnd[nd], depth[x]); if(mom != -1) dfs_tree[mom].pb(nd); } vector<int> ans; vector<bool> forbidden; int cnt; void create_ans(int nd, int id){ if(cnt == 0) return; ans[nd] = id; cnt--; for(int x: dfs_tree[nd]) if(!forbidden[x]) create_ans(x, id); } bool found = 0; void dfs2(int nd){ if(found) return; int X = sz[nd]; vector<int> rem; if(X < s[0]) goto end_func; for(int x: dfs_tree[nd]) if(sz[x] >= s[0]) goto end_func; for(int x: dfs_tree[nd]) if(mnd[x] < depth[nd] && X-sz[x] >= s[0]) X-=sz[x], rem.pb(x); if(n-X < s[0]) goto end_func; found = 1; assert(nd != 0); if(X >= s[1]){ ans.assign(n, so[2]); int y = s[0]; for(int x: rem){ y-=sz[x]; cnt = sz[x]; create_ans(x, so[0]); forbidden[x] = 1; } cnt = s[1]; create_ans(nd, so[1]); cnt = y; forbidden[nd] = 1; create_ans(0, so[0]); } else{ ans.assign(n, so[2]); int y = s[1]; for(int x: rem){ y-=sz[x]; cnt = sz[x]; create_ans(x, so[1]); forbidden[x] = 1; } cnt = s[0]; create_ans(nd, so[0]); cnt = y; forbidden[nd] = 1; create_ans(0, so[1]); } return; end_func: for(int x: dfs_tree[nd]) dfs2(x); } vector<int> find_split(int _n, int a, int b, int c, vector<int> U, vector<int> V){ s = {a, b, c}, so = {1, 2, 3}; sort(so.begin(), so.end(), [&](int i, int j){ return s[i-1] < s[j-1]; }); sort(s.begin(), s.end()); swap(n, _n); m = U.size(); graph.resize(n); dfs_tree.resize(n); depth.resize(n); mnd.assign(n, n); visited.assign(n, 0); sz.assign(n, 1); forbidden.assign(n, 0); for(int i = 0; i < m; i++){ graph[U[i]].pb(V[i]); graph[V[i]].pb(U[i]); } dfs(0, -1); dfs2(0); if(found) return ans; else return vector<int>(n, 0); }
#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...