Submission #246404

#TimeUsernameProblemLanguageResultExecution timeMemory
246404LifeHappen__Split the Attractions (IOI19_split)C++14
0 / 100
117 ms19064 KiB
#include <bits/stdc++.h> #include "split.h" using namespace std; #define forinc(a, b, c) for(int a = b, _c = c; a <= _c; ++a) #define fordec(a, b, c) for(int a = b, _c = c; a >= _c; --a) #define rep(i, a) forinc(i, 1, a) #define repv(i, a) forinc(i, 0, a - 1) #define forv(a, b) for(auto &a : b) #define ii pair<int, int> #define fi first #define se second #define reset(f, x) memset(f, x, sizeof(f)) #define all(a) begin(a), end(a) #define pb push_back #define eb emplace_back #define mp make_pair #define bit(x, i) (x >> (i - 1) & 1ll) #define on(x, i) (x | (1ll << (i - 1))) #define off(x, i) (x & ~(1ll << (i - 1))) const int N = 1e5 + 5; int n, m; int a, b, c, dd[N], req; vector <int> ad[N]; ii ed[N]; struct dsu { vector <int> id; dsu(int n) { id.resize(n, -1); } void init(int n) { id.resize(n, -1); } int root(int x) {return id[x] < 0 ? x : id[x] = root(id[x]);} bool com(int u, int v) { u = root(u), v = root(v); if(u == v) return false; if(id[u] < id[v]) swap(u, v); id[u] += id[v]; id[v] = u; return true; } bool same(int u, int v) { return root(u) == root(v); } int sz(int x) { return -id[root(x)]; } }; int sz[N], pd[N], cnt = 0; int find_cen(int siz) { function<void(int, int)> dfs = [&](int u, int par) { sz[u] = 1; forv(v, ad[u]) if(v != par) { pd[v] = u; dfs(v, u); sz[u] += sz[v]; } }; dfs(0, -1); int u = 0; pair<int, int> mx = {-1, -1}; while(1) { mx = {-1, -1}; forv(v, ad[u]) if(v != pd[u]) mx = max(mx, make_pair(sz[v], v)); if(mx.fi <= siz) return u; u = mx.se; } assert(0); } void col(int u, int par, int &cnt, int cl) { if(!cnt) return; if(dd[u]) return; if(u == par) return; dd[u] = cl; cnt--; forv(v, ad[u]) col(v, par, cnt, cl); } vector <int> find_split(int _n, int _a, int _b, int _c, vector<int> p, vector<int> q) { n = _n, a = _a, b = _b, c = _c; int ca, cb, cc; vector <ii> _; _.eb(a, 1); _.eb(b, 2); _.eb(c, 3); sort(all(_)); tie(a, ca) = _[0]; tie(b, cb) = _[1]; tie(c, cc) = _[2]; m = p.size(); repv(i, m) { int u = p[i], v = q[i]; //ad[u].pb(v); ad[v].pb(u); ed[i + 1] = {u, v}; } dsu f(n); rep(i, m) { int u = ed[i].fi, v = ed[i].se; if(f.com(u, v)) { ad[u].pb(v); ad[v].pb(u); } } int r = find_cen(n - b); f.init(n); forinc(i, 0, n - 1) { forv(v, ad[i]) { if(i != r && v != r) f.com(i, v); } } forinc(i, 0, m - 1) { int u = p[i], v = q[i]; if(f.sz(u) >= a || f.sz(v) >= a) continue; if(u != r && v != r) { if(f.com(u, v)) { ad[u].pb(v); ad[v].pb(u); } } } forv(v, ad[r]) if(f.sz(v) >= a) { col(v, r, a, ca); col(r, -1, b, cb); forinc(i, 0, n - 1) if(!dd[i]) dd[i] = cc; break; } vector <int> result; forinc(i, 0, n - 1) result.pb(dd[i]); return result; } /* signed main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); #define task "split" if(fopen("inp.txt", "r")) { freopen("inp.txt", "r", stdin); } cin >> n >> m >> a >> b >> c; vector <int> p(m), q(m); repv(i, m) { cin >> p[i] >> q[i]; } vector <int> ans = find_split(n, a, b, c, p, q); forv(v, ans) cout << v << ' '; } */
#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...