Submission #627238

#TimeUsernameProblemLanguageResultExecution timeMemory
627238model_codeRarest Insects (IOI22_insects)C++17
100 / 100
689 ms2516 KiB
// correct/solution-prabowo-ac.cpp
#include "insects.h"

#include <map>
#include <numeric>
#include <vector>

int N;
std::vector<bool> lastPress, where;

void _move_inside(int i) {
  where[i] = true;
}

void _move_outside(int i) {
  where[i] = false;
}

std::map<std::vector<bool>, int> memo;
int _press_button() {
  if (memo.find(where) != memo.end()) return memo[where];
  for (int i = 0; i < N; ++i) {
    if (where[i] == lastPress[i]) continue;
    if (where[i]) move_inside(i);
    else move_outside(i);
  }
  lastPress = where;
  return memo[where] = press_button();
}

int min_cardinality(int _N) {
  N = _N;
  lastPress.assign(N, false); where.assign(N, false);

  std::vector<int> insects(N);
  std::iota(insects.begin(), insects.end(), 0);

  std::vector<bool> isInside(N);

  // Count distincts
  std::vector<int> insides, outsides;
  int inside = 0;
  for (int insect : insects) {
    _move_inside(insect);
    if (_press_button() > 1) {
      _move_outside(insect);
      outsides.push_back(insect);
    } else {
      insides.push_back(insect);
      ++inside;
    }
  }
  int distinct = inside;
  insects = outsides;

  int l = 1, r = N / distinct;
  int ans = -1;
  while (l <= r) {
    int mid = (l + r + 1) / 2;

    insides.clear(); outsides.clear();
    for (int insect : insects) {
      _move_inside(insect);
      if (_press_button() > mid) {
        _move_outside(insect);
        outsides.push_back(insect);
      } else {
        insides.push_back(insect);
        ++inside;
      }
    }

    if (inside == mid * distinct) {
      ans = mid;
      l = mid + 1;
      insects = outsides;
    } else {
      r = mid - 1;
      insects = insides;
      for (int insect : insects) {
        _move_outside(insect);
        --inside;
      }
    }
  }

  return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...