제출 #1279408

#제출 시각아이디문제언어결과실행 시간메모리
1279408lightentheshadowSplit the Attractions (IOI19_split)C++20
100 / 100
72 ms27052 KiB
#include "split.h" #include <bits/stdc++.h> using namespace std; const int maxN = 1e5 + 5; vector<int> adj[maxN], graph[maxN]; int in[maxN], out[maxN], sz[maxN], arr[maxN], par[maxN], timeDfs = 0; void dfsTree(int u) { in[u] = ++timeDfs; arr[timeDfs] = u; sz[u] = 1; for (auto v: adj[u]) { if (sz[v]) continue; graph[u].push_back(v); par[v] = u; dfsTree(v); sz[u] += sz[v]; } out[u] = timeDfs; } bool inside[maxN]; int done[maxN]; int require; vector<int> save; void dfsNode(int u) { if (require > save.size()) save.push_back(u); done[u] = 1; for (auto v: adj[u]) { if (done[v]) continue; dfsNode(v); } } vector<int> find_split(int n, int A, int B, int C, vector<int> U, vector<int> V) { int m = U.size(); for (int i = 0; i < m; i++) { adj[U[i]].push_back(V[i]); adj[V[i]].push_back(U[i]); } dfsTree(0); int a = min({A, B, C}), c = max({A, B, C}), b = A + B + C - a - c; int node = 0; for (int i = 0; i < n; i++) { if (sz[i] < a) continue; bool kt = true; for (auto x: graph[i]) if (sz[x] >= a) kt = false; if (kt) { node = i; break; } } for (int i = in[node]; i <= out[node]; i++) inside[arr[i]] = true; for (int i = in[node]; i <= out[node]; i++) { int u = arr[i]; if (!inside[u]) continue; bool kt = false; for (auto v: adj[u]) if (!inside[v]) { kt = true; break; } if (!kt) continue; if (sz[node] - sz[u] >= a) { for (int j = in[u]; j <= out[u]; j++) inside[arr[j]] = false; sz[node] -= sz[u]; } } vector<int> ans(n, 0); if (n - sz[node] < a) return ans; if (sz[node] < n - sz[node]) { save.clear(); for (int i = 0; i < n; i++) if (!inside[i]) done[i] = 1; else done[i] = 0; require = a; dfsNode(node); for (auto x: save) ans[x] = 1; save.clear(); for (int i = 0; i < n; i++) if (inside[i]) done[i] = 1; else done[i] = 0; require = b; dfsNode(par[node]); for (auto x: save) ans[x] = 2; for (int i = 0; i < n; i++) if (ans[i] == 0) ans[i] = 3; } else { save.clear(); for (int i = 0; i < n; i++) if (!inside[i]) done[i] = 1; else done[i] = 0; require = b; dfsNode(node); for (auto x: save) ans[x] = 2; save.clear(); for (int i = 0; i < n; i++) if (inside[i]) done[i] = 1; else done[i] = 0; require = a; dfsNode(par[node]); for (auto x: save) ans[x] = 1; for (int i = 0; i < n; i++) if (ans[i] == 0) ans[i] = 3; } int Swap[4]; if (a == A) Swap[1] = 1; else if (a == B) Swap[1] = 2; else Swap[1] = 3; if (b == A && Swap[1] != 1) Swap[2] = 1; else if (b == B && Swap[1] != 2) Swap[2] = 2; else Swap[2] = 3; Swap[3] = 6 - Swap[1] - Swap[2]; for (int i = 0; i < n; i++) ans[i] = Swap[ans[i]]; 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...