Submission #442695

#TimeUsernameProblemLanguageResultExecution timeMemory
442695Lam_lai_cuoc_doiICC (CEOI16_icc)C++17
100 / 100
189 ms484 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using ld = long double; using ull = unsigned long long; constexpr bool typetest = 0; constexpr int N = 1e2 + 5; struct dsu { int n; int par[N]; dsu() { memset(par, -1, sizeof par); } int findpar(int v) { return par[v] < 0 ? v : par[v] = findpar(par[v]); } void Merge(int u, int v) { u = findpar(u); v = findpar(v); if (u == v) return; if (par[u] < par[v]) swap(u, v); par[v] += par[u]; par[u] = v; } } f; int a[N], b[N], x, y, c[N]; #include "icc.h" #define bit(i, x) (((x) >> (i)) & 1) int Cal(int m, int a[N], int n, int b[N]) { int l = 1, r = m; while (l <= r) { int mid = (l + r) / 2; for (int i = l; i <= mid; ++i) c[i - l] = a[i - 1]; if (query(mid - l + 1, n, c, b)) r = mid - 1; else l = mid + 1; } return a[l - 1]; } void run(int n) { f.n = n; for (int i = 1; i < n; ++i) { int XOR(0); for (int j = __lg(n); ~j; --j) { x = 0; y = 0; for (int t = 1; t <= n; ++t) if (bit(j, f.findpar(t))) a[x++] = t; else b[y++] = t; if (x != 0 && y != 0 && query(x, y, a, b)) XOR |= 1 << j; } int v = __lg(XOR & -XOR); //cout << v << " ok\n"; int A(0), B(0); B |= 1 << v; for (int j = __lg(n); ~j; --j) if (j != v) { x = y = 0; if (bit(j, XOR)) { for (int t = 1; t <= n; ++t) if (!bit(j, f.findpar(t)) && !bit(v, f.findpar(t))) a[x++] = t; else if (bit(j, f.findpar(t)) && bit(v, f.findpar(t))) b[y++] = t; if (x != 0 && y != 0 && query(x, y, a, b)) B |= 1 << j; else A |= 1 << j; } else { for (int t = 1; t <= n; ++t) if (!bit(j, f.findpar(t)) && bit(v, f.findpar(t))) a[x++] = t; else if (!bit(j, f.findpar(t)) && !bit(v, f.findpar(t))) b[y++] = t; if (x == 0 || y == 0 || !query(x, y, a, b)) { B |= 1 << j; A |= 1 << j; } } } //cout << A << " " << B << "\n"; x = y = 0; for (int t = 1; t <= n; ++t) if (f.findpar(t) == A) a[x++] = t; else if (f.findpar(t) == B) b[y++] = t; if (x != 1) { a[0] = Cal(x, a, y, b); x = 1; } if (y != 1) { b[0] = Cal(y, b, x, a); y = 1; } f.Merge(a[0], b[0]); setRoad(a[0], b[0]); } }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...