Submission #1233838

#TimeUsernameProblemLanguageResultExecution timeMemory
1233838jasonicSplit the Attractions (IOI19_split)C++20
40 / 100
94 ms20296 KiB
#include <bits/stdc++.h> #include "split.h" using namespace std; #define ll long long #define fastIO cin.tie(0); ios::sync_with_stdio(false) int labels[3] = {1, 2, 3}; int n, m, a, b, c; vector<vector<int>> bigadjlist; vector<vector<int>> adjlist; int sz[200005]; void calc_sizes(int v, int p = -1) { sz[v] = 1; for(auto i : adjlist[v]) if(i != p) { calc_sizes(i, v); sz[v] += sz[i]; } }; int get_centroid(int v, int p = -1) { for(auto i : adjlist[v]) if(i != p) { if(sz[i] * 2 > n) return get_centroid(i, v); } return v; } int need = 0; void dfs_fill(vector<int> &arr, int val, int v, int p = -1) { if(need == 0) return; arr[v] = val; need--; if(need == 0) return; for(auto i : adjlist[v]) if(i != p) { dfs_fill(arr, val, i, v); if(need == 0) return; } } vector<int> solve(int c, int s) { vector<int> ans(n, labels[2]); vector<bool> vis(n, false); need = a; dfs_fill(ans, labels[0], s, c); need = b; dfs_fill(ans, labels[1], c, s); return ans; } vector<int> find_split(int N, int A, int B, int C, vector<int> p, vector<int> q) { n = N; m = p.size(); a=A, b=B, c=C; bigadjlist = vector<vector<int>>(n); adjlist = vector<vector<int>>(n); for(int i = 0; i < m; i++) { bigadjlist[p[i]].push_back(q[i]); bigadjlist[q[i]].push_back(p[i]); } // assign the correct things if(c < a) { swap(a, c); swap(labels[0], labels[2]); } if(b < a) { swap(a, b); swap(labels[0], labels[1]); } if(c < b) { swap(c, b); swap(labels[1], labels[2]); } // dfs tree to find correct edges vector<int> vis(n, false); stack<int> dfs; dfs.push(0); vis[0] = true; while(!dfs.empty()) { int curr = dfs.top(); dfs.pop(); for(auto i : bigadjlist[curr]) if(!vis[i]) { adjlist[curr].push_back(i); adjlist[i].push_back(curr); dfs.push(i); vis[i] = true; } } calc_sizes(0); int centroid = get_centroid(0); calc_sizes(centroid); // check if the dfs tree is of any use for(auto i : adjlist[centroid]) { if(a <= sz[i]) return solve(centroid, i); } vector<int> ans = vector<int>(n, 0); 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...