Submission #1244385

#TimeUsernameProblemLanguageResultExecution timeMemory
1244385badge881Rarest Insects (IOI22_insects)C++20
100 / 100
17 ms472 KiB
#include <bits/stdc++.h> #define ll long long using namespace std; mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()); int rand_index(int n) { return abs((ll)rng()) % n + 1; } vector<int> current; int total; void move_inside(int); void move_outside(int); int press_button(); void insert(int i) { for (int x : current) if (x == i) return; move_inside(i); current.push_back(i); } void erase(int i) { auto it = find(current.begin(), current.end(), i); if (it != current.end()) { move_outside(i); current.erase(it); } } int press() { return press_button(); } void shuffle_vec(vector<int>& v) { for (int i = 0; i < v.size(); ++i) swap(v[i], v[rand_index(v.size()) - 1]); } int min_cardinality(int N) { total = N; vector<int> pool, stable; bool keep = true; for (int i = 0; i < total; ++i) { insert(i); pool.push_back(i); if (i && press() > 1) erase(i); } int base = current.size(); stable = current; if (base == 1) { current.clear(); return total; } int low = 1, high = total / base + 1; while (low + 1 < high) { int mid = (low + high) / 2; shuffle_vec(pool); if (!keep) { for (int x : pool) if (find(stable.begin(), stable.end(), x) == stable.end()) erase(x); } for (int i = 0; i < pool.size(); ++i) { if ((int)current.size() == base * mid) break; int before = current.size(); insert(pool[i]); if ((int)current.size() > before && press() > mid) erase(pool[i]); } if ((int)current.size() == base * mid) { low = mid; stable = current; keep = true; } else { high = mid; pool = current; keep = false; } } current.clear(); return low; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...