Submission #659916

#TimeUsernameProblemLanguageResultExecution timeMemory
659916peijarRarest Insects (IOI22_insects)C++17
100 / 100
58 ms436 KiB
#include "insects.h" #include <bits/stdc++.h> using namespace std; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); int randint(int lb, int ub) { return uniform_int_distribution<int>(lb, ub)(rng); } int min_cardinality(int N) { vector<int> roots; int nbCC = 0; for (int i = 0; i < N; ++i) { move_inside(i); if (i and press_button() == 2) move_outside(i); else roots.push_back(i), nbCC++; } vector<bool> isRoot(N); for (int r : roots) isRoot[r] = true; vector<int> toProcess; for (int i = 0; i < N; ++i) if (!isRoot[i]) toProcess.push_back(i); if (nbCC == 1) return N; shuffle(toProcess.begin(), toProcess.end(), rng); set<int> inside(roots.begin(), roots.end()); int lo = 1, up = N / nbCC; while (lo < up) { int mid = (lo + up + 1) / 2; vector<int> popped; vector<int> insideMachine; vector<int> notProcessed; for (int u : toProcess) { if ((int)inside.size() == nbCC * mid) { popped.push_back(u); } else { move_inside(u); inside.insert(u); if (press_button() > mid) popped.push_back(u), move_outside(u), inside.erase(u); else insideMachine.push_back(u); } } if ((int)popped.size() == N - mid * nbCC) { toProcess = popped; lo = mid; } else { for (int u : insideMachine) move_outside(u), inside.erase(u); toProcess = insideMachine; for (int x : notProcessed) toProcess.push_back(x); N = toProcess.size() + inside.size(); up = mid - 1; } } return lo; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...