제출 #1018263

#제출 시각아이디문제언어결과실행 시간메모리
1018263c2zi6Split the Attractions (IOI19_split)C++14
40 / 100
515 ms1048576 KiB
#define _USE_MATH_DEFINES #include <bits/stdc++.h> #define ff first #define ss second #define pb push_back #define all(a) (a).begin(), (a).end() #define replr(i, a, b) for (int i = int(a); i <= int(b); ++i) #define reprl(i, a, b) for (int i = int(a); i >= int(b); --i) #define rep(i, n) for (int i = 0; i < int(n); ++i) #define mkp(a, b) make_pair(a, b) using namespace std; typedef long long ll; typedef long double ld; typedef pair<int, int> PII; typedef vector<int> VI; typedef vector<PII> VPI; typedef vector<VI> VVI; typedef vector<VVI> VVVI; typedef vector<VPI> VVPI; typedef pair<ll, ll> PLL; typedef vector<ll> VL; typedef vector<PLL> VPL; typedef vector<VL> VVL; typedef vector<VVL> VVVL; typedef vector<VPL> VVPL; template<class T> T setmax(T& a, T b) {if (a < b) return a = b; return a;} template<class T> T setmin(T& a, T b) {if (a < b) return a; return a = b;} #include <ext/pb_ds/assoc_container.hpp> using namespace __gnu_pbds; template<class T> using indset = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; #include "split.h" namespace TEST1 { bool check(int n, int A, int B, int C, VI P, VI Q) { int m = P.size(); VI degree(n); rep(i, m) { degree[P[i]]++; degree[Q[i]]++; } for (int x : degree) if (x > 2) return false; return true; } VI find_split(int n, int A, int B, int C, VI U, VI V) { VVI gp(n); int m = U.size(); rep(i, m) { gp[U[i]].pb(V[i]); gp[V[i]].pb(U[i]); } int st = -1; int nd = -1; rep(u, n) if (gp[u].size() == 1) { if (st == -1) st = u; else nd = u; } if (st == -1) { st = 0; nd = gp[0].back(); gp[0].pop_back(); } VI ans(n, 3); auto color = [&](int u, int cnt, int col) { int p = -1; while (cnt--) { ans[u] = col; for (int v : gp[u]) if (v != p) { p = u; u = v; break; } } }; color(st, A, 1); color(nd, B, 2); return ans; } }; namespace TEST2 { int n; VVI gp; VI vis; VI ans; int cnt; void dfs(int u) { if (cnt == 0) return; ans[u] = 2; cnt--; vis[u] = true; for (int v : gp[u]) if (!vis[v]) { dfs(v); } } VI find_split(int N, int A, int B, int C, VI U, VI V) { n = N; gp = VVI(n); int m = U.size(); rep(i, m) { gp[U[i]].pb(V[i]); gp[V[i]].pb(U[i]); } vis = VI(n); ans = VI(n, 3); cnt = B; dfs(0); rep(u, n) if (ans[u] == 3) { ans[u] = 1; break; } return ans; } }; namespace TEST3 { int n; VVI gp; VI sub; VI par; void dfs1(int u = 0, int p = -1) { par[u] = p; sub[u] = 1; for (int v : gp[u]) if (v != p) { dfs1(v, u); sub[u] += sub[v]; } } VI ans; int col; int cnt; void dfs2(int u, int p) { if (cnt == 0) return; ans[u] = col; cnt--; for (int v : gp[u]) if (v != p) { dfs2(v, u); } } VI find_split(int N, int A, int B, int C, VI U, VI V) { // sorting map<int, int> real; real[1] = 1; real[2] = 2; real[3] = 3; if (A > B) { swap(A, B); swap(real[1], real[2]); } if (B > C) { swap(B, C); swap(real[2], real[3]); } if (A > B) { swap(A, B); swap(real[1], real[2]); } /*cout << A << " " << B << " " << C << endl;*/ /*cout << "MUST REPLACE " << 1 << " WITH " << real[1] << endl;*/ /*cout << "MUST REPLACE " << 2 << " WITH " << real[2] << endl;*/ /*cout << "MUST REPLACE " << 3 << " WITH " << real[3] << endl;*/ n = N; int m = U.size(); gp = VVI(n); rep(i, m) { gp[U[i]].pb(V[i]); gp[V[i]].pb(U[i]); } par = sub = VI(n); dfs1(); int st = -1; //B int nd = -1; //A rep(u, n) { if (n-sub[u] >= A && sub[u] >= A) { if (sub[u] > n/2) { st = u; nd = par[u]; } else { st = par[u]; nd = u; } break; } } if (st == -1) return VI(n, 0); ans = VI(n, 3); col = 1; cnt = A; dfs2(nd, st); col = 2; cnt = B; dfs2(st, nd); for (int& x : ans) x = real[x]; return ans; } }; VI find_split(int n, int A, int B, int C, VI P, VI Q) { if (TEST1::check(n, A, B, C, P, Q)) return TEST1::find_split(n, A, B, C, P, Q); if (A == 1) return TEST2::find_split(n, A, B, C, P, Q); return TEST3::find_split(n, A, B, C, P, Q); }
#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...