Submission #294681

#TimeUsernameProblemLanguageResultExecution timeMemory
294681_7_7_Split the Attractions (IOI19_split)C++14
0 / 100
97 ms10616 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[u]; } bool check (int v) { if ((!T.s.s && upper(T.s.f, v)) || (T.s.s && upper(v, T.s.f))) 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); dfs(0); T = {inf, {inf, inf}}; if (a > b && a > c) swap(a, c); if (b > a && b > c) swap(b, c); if (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] >= a) T = min(T, mp(n - cnt[i], mp(i, 1))); } if (n - T.f < b) return res; int root = 0; while (!check(root)) ++root; dfs1(root, 1, b); dfs2(T.s.f, 2, a); for (int i = 0; i < n; ++i) if (!res[i]) res[i] = 3; return res; }

Compilation message (stderr)

split.cpp: In function 'bool upper(int, int)':
split.cpp:65:37: warning: self-comparison always evaluates to true [-Wtautological-compare]
   65 |  return tin[v] <= tin[u] && tout[u] <= tout[u];
      |                             ~~~~~~~ ^~ ~~~~~~~
#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...