Submission #1258588

#TimeUsernameProblemLanguageResultExecution timeMemory
1258588biankICC (CEOI16_icc)C++20
100 / 100
71 ms640 KiB
#include <bits/stdc++.h> #include "icc.h" #define forsn(i, s, n) for (int i = int(s); i < int(n); i++) #define forn(i, n) forsn(i, 0, n) #define dforsn(i, s, n) for (int i = int(n) - 1; i >= int(s); i--) #define dforn(i, n) dforsn(i, 0, n) #define sz(x) int(x.size()) #define all(x) begin(x), end(x) #define pb push_back #define eb emplace_back #define fst first #define snd second using namespace std; using vi = vector<int>; using ii = pair<int, int>; struct DSU { vi p; vector<vi> c; DSU(int n) : p(n), c(n) { forn(i, n) p[i] = i, c[i] = vi{i}; } int find(int x) { if (p[x] == x) return x; return p[x] = find(p[x]); } bool unite(int x, int y) { x = find(x), y = find(y); if (x == y) return false; if (sz(c[x]) > sz(c[y])) swap(x, y); for (int u : c[y]) c[x].pb(u); c[y].clear(), p[y] = x; return true; } }; bool ask(vector<ii> a, vector<ii> b) { int A[sz(a)], B[sz(b)]; forn(i, sz(a)) A[i] = a[i].fst + 1; forn(i, sz(b)) B[i] = b[i].fst + 1; return query(sz(a), sz(b), A, B); } ii solve(vector<ii> &a, vector<ii> &b, int k) { int lo = 0, hi = sz(b); while (hi - lo > 1) { int mid = (lo + hi) / 2; if (ask(a, vector<ii>(begin(b), begin(b) + mid))) hi = mid; else lo = mid; } b = {b[lo]}; vector<ii> new_a; forn(i, sz(a)) { int flag = true; forn(bit, k) if ((b.back().snd >> bit & 1) != (a[i].snd >> bit & 1)) { flag = false; } if (flag) new_a.pb(a[i]); } a = new_a; lo = 0, hi = sz(a); while (hi - lo > 1) { int mid = (lo + hi) / 2; if (ask(vector<ii>(begin(a), begin(a) + mid), b)) hi = mid; else lo = mid; } a = {a[lo]}; return ii{a.back().fst, b.back().fst}; } void run(int N) { DSU dsu(N); forn(_, N - 1) { vector<vi> components; forn(u, N) if (dsu.p[u] == u) components.pb(dsu.c[u]); int bit = 0; while ((1 << bit) < sz(components)) { vector<ii> v[2]; forn(i, sz(components)) { for (int u : components[i]) v[i >> bit & 1].eb(u, i); } if (ask(v[0], v[1])) { auto [a, b] = solve(v[0], v[1], bit); setRoad(a + 1, b + 1); dsu.unite(a, b); break; } bit++; } } }
#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...