제출 #1330140

#제출 시각아이디문제언어결과실행 시간메모리
1330140SpyrosAliv드문 곤충 (IOI22_insects)C++20
0 / 100
1 ms344 KiB
#include "insects.h"
#include <bits/stdc++.h>
using namespace std;

int n;
vector<bool> ins, bad;

void rem(int i) {
  if (ins[i]) move_outside(i);
  ins[i] = false;
}

void add(int i) {
  if (!ins[i]) move_inside(i);
  ins[i] = true;
}

void dbg(vector<int> a) {
  cout << "DBG: ";
  for (auto x: a) cout << x << " ";
  cout << "\n";
}

int min_cardinality(int N) {
  n = N;
  ins.assign(n, false);
  int types = 0;
  for (int i = 0; i < n; i++) {
    add(i);
    int x = press_button();
    if (x > 1) {
      rem(i);
    }
    else types++;
  }
  if (types == 1) {
    return n;
  }
  bad.assign(n, false);
  vector<int> cands;
  for (int i = 0; i < n; i++) {
    rem(i);
    cands.push_back(i);
  }
  while (types * types < n) {
    vector<int> nxt;
    for (int i = 0; i < n; i++) {
      add(cands[i]);
    }
    int mx = press_button();
    for (int i = 0; i < n; i++) {
      rem(i);
      if (press_button() < mx) {
        add(i);
        continue;
      }
      else {
        nxt.push_back(i);
      }
    }
    for (int i = 0; i < n; i++) {
      rem(cands[i]);
    }
    cands = nxt;
    n = cands.size();
  }
  int lo = 0, hi = n / types;
  int fin = n / types + 1;
  while (lo <= hi) {
    int mid = (lo + hi) / 2;
    for (int i = 0; i < n; i++) {
      rem(cands[i]);
    }
    int haveIn = 0;
    for (int i = 0; i < n; i++) {
      add(cands[i]);
      haveIn++;
      if (press_button() > mid) {
        rem(cands[i]);
        haveIn--;
      }
    }
    int should = types * mid;
    //dbg({mid, should});
    if (haveIn < should) {
      hi = mid-1;
    }
    else {
      fin = mid;
      lo = mid+1;
    }
  }
  return fin;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...