Submission #294699

#TimeUsernameProblemLanguageResultExecution timeMemory
294699_7_7_Split the Attractions (IOI19_split)C++14
7 / 100
115 ms15224 KiB
#include "split.h" #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; //#define int long long //#pragma GCC optimize("Ofast") //#pragma comment(linker, "/stack:200000000") //#pragma GCC target("sse,sse2,sse3,ssse3,sse4") #define file(s) freopen(s".in","r",stdin); freopen(s".out","w",stdout); #define fastio ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0); #define all(x) x.begin(), x.end() #define sz(s) (int)s.size() #define pb push_back #define ppb pop_back #define mp make_pair #define s second #define f first typedef pair < long long, long long > pll; typedef pair < int, int > pii; typedef unsigned long long ull; typedef vector < pii > vpii; typedef vector < int > vi; typedef long double ldb; typedef long long ll; typedef double db; typedef tree < int, null_type, less < int >, rb_tree_tag, tree_order_statistics_node_update > ordered_set; const int inf = 1e9, maxn = 2e5 + 48, mod = 998244353, N = 1e5 + 112; const int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, 1, -1}, block = 300; const pii base = mp(1171, 3307), Mod = mp(1e9 + 7, 1e9 + 9); const db eps = 1e-12, pi = acos(-1); const ll INF = 1e18; using namespace std; int n, m, cnt[N], tin[N], tout[N], timer; pair < int, pii > T; vi g[N], res; void dfs (int v) { tin[v] = ++timer; cnt[v] = 1; for (auto to : g[v]) if (!cnt[to]) { dfs(to); cnt[v] += cnt[to]; } tout[v] = timer; } bool upper (int v, int u) { return tin[v] <= tin[u] && tout[u] <= tout[v]; } bool check (int v) { if (v == T.s.f) return 0; if ((!T.s.s && upper(T.s.f, v)) || (T.s.s && !upper(T.s.f, v))) return 0; return 1; } void dfs1 (int v, int c, int &x) { if (!x) return; --x; res[v] = c; for (auto to : g[v]) if (check(to) && !res[to]) dfs1(to, c, x); } void dfs2 (int v, int c, int &x) { if (!x) return; --x; res[v] = c; for (auto to : g[v]) if (!check(to) && !res[to]) dfs2(to, c, x); } vi find_split(int _n, int a, int b, int c, vi p, vi q) { n = _n; m = sz(p); for (int i = 0; i < m; ++i) { g[p[i]].pb(q[i]); g[q[i]].pb(p[i]); } res.resize(n, 0); dfs(0); T = {inf, {inf, inf}}; int A = 1, B = 2, C = 3; if (a > b && a > c) { swap(A, C); swap(a, c); } if (b > a && b > c) { swap(b, c); swap(B, C); } if (a > b) { swap(a, b); swap(A, B); } for (int i = 0; i < n; ++i) { if (cnt[i] >= a) T = min(T, mp(cnt[i], mp(i, 0))); if (n - cnt[i] + 1 >= a) T = min(T, mp(n - cnt[i] + 1, mp(i, 1))); } if (n - T.f < b) return res; int root = 0; while (!check(root)) ++root; // assert(root < n); dfs1(root, B, b); dfs2(T.s.f, A, a); for (int i = 0; i < n; ++i) if (!res[i]) res[i] = C; return res; }
#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...