# | Submission time | Handle | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
942174 | 2024-03-10T10:31:38 Z | benjaminkleyn | Rarest Insects (IOI22_insects) | C++17 | 0 ms | 0 KB |
#include <bits/stdc++.h> #include "insects.h" using namespace std; int cnt; bool inside[2000]; bool bad[2000]; void init() { cnt = 0; memset(inside, false, sizeof(inside)); memset(bad, false, sizeof(bad)); } void move_in(int i) { if (inside[i]) return; cnt++; inside[i] = true; move_inside(i); } void move_out(int i) { if (!inside[i]) return; cnt--; inside[i] = false; move_outside(i); } int min_cardinality(int N) { init(); for (int i = 0; i < N; i++) { move_in(i); if (press_button() > 1) move_out(i); } int num_types = cnt; if (num_types == 1) return N; if (num_types == N) return 1; int lo = 1, hi = N / cnt + 1, mid; while (lo < hi) { mid = lo + (hi - lo + 1) / 2; shuffle(p.begin(), p.end(), rng); vector<int> new_insects; vector<int> bad_insects; for (int i = 0; i < N; i++) { if (!(bad[i] || inside[i])) { move_in(i); if (press_button() > mid) { bad_insects.push_back(i); move_out(i); } else new_insects.push_back(i); if (cnt >= mid * num_types) break; } } if (cnt == mid * num_types) lo = mid; else { for (int i : bad_insects) bad[i] = true; for (int i : new_insects) move_out(i); hi = mid - 1; } } return lo; }