Submission #632929

#TimeUsernameProblemLanguageResultExecution timeMemory
632929hltkRarest Insects (IOI22_insects)C++17
99.82 / 100
69 ms404 KiB
#include "insects.h"

#include <algorithm>
#include <numeric>
#include <random>
#include <vector>

using namespace std;

int min_cardinality(int n) {
  mt19937_64 gen{312321321321};
  vector<int> inds(n);
  iota(inds.begin(), inds.end(), 0);
  shuffle(inds.begin(), inds.end(), gen);
  vector<int> avail;
  int inside = 0, types = 0;
  for (int i : inds) {
    move_inside(i), inside++;
    if (press_button() == 1) {
      types++;
    } else {
      avail.push_back(i);
      move_outside(i), inside--;
    }
  }
  if (types == 1 || types == n) {
    return 1 ^ n ^ types;
  }
  int l = 1, r = n / types;
  while (l < r) {
    int m = (l + r) / 2, k = m + 1;
    vector<int> vin, vout;
    shuffle(avail.begin(), avail.end(), gen);
    for (int i : avail) {
      if (inside == k * types) {
        vout.push_back(i);
        continue;
      }
      move_inside(i), inside++;
      if (press_button() > k) {
        move_outside(i), inside--;
        vout.push_back(i);
      } else {
        vin.push_back(i);
      }
    }
    if (inside < k * types) {
      for (int u : vin) {
        move_outside(u), inside--;
      }
      avail = vin;
      r = m;
    } else {
      avail = vout;
      l = m + 1;
    }
  }
  return l;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...