Submission #1330164

#TimeUsernameProblemLanguageResultExecution timeMemory
1330164SpyrosAliv드문 곤충 (IOI22_insects)C++20
0 / 100
1 ms412 KiB
#include "insects.h"
#include <bits/stdc++.h>
using namespace std;

int n;
vector<bool> ins;
vector<int> cnt, cands;
int types;

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";
}

void dnc(int l, int r, vector<int> curr) {
  if (curr.empty() || l > r) return;
  if (l == r) {
    cnt[l] += curr.size();
    return;
  }
  int mid = (l + r) / 2;
  vector<int> inA, inB;
  for (int i = l; i <= mid; i++) {
    add(cands[i]);
  }
  int tot = press_button();
  assert(tot == 1);
  for (auto x: curr) {
    add(x);
    if (tot > 1) {
      inA.push_back(x);
    }
    else {
      inB.push_back(x);
    }
    rem(x);
  }
  for (int i = l; i <= r; i++) rem(cands[i]);
  dnc(l, mid, inA);
  dnc(mid+1, r, inB);
}

int min_cardinality(int N) {
  n = N;
  ins.assign(n, false);
  vector<bool> ok(n, false);
  types = 0;
  for (int i = 0; i < n; i++) {
    add(i);
    int x = press_button();
    if (x > 1) {
      rem(i);
    }
    else {
      types++;
      cands.push_back(i);
      ok[i] = true;
    }
  }
  for (int i = 0; i < n; i++) {
    rem(i);
  }
  if (types == 1) {
    return n;
  }
  //dbg(cands);
  cnt.assign(types, 1);
  if (types * types <= n) {
    vector<int> curr;
    for (int i = 0; i < n; i++) {
      if (!ok[i]) curr.push_back(i);
    }
    dnc(0, types-1, curr);
    int ans = cnt[0];
    for (int i = 0; i < types; i++) ans = min(ans, cnt[i]);
    return ans;
  }
  int lo = 1, hi = n / types;
  int fin = n / types + 1;
  while (lo <= hi) {
    int mid = (lo + hi) / 2;
    for (int i = 0; i < n; i++) {
      rem(i);
    }
    int haveIn = 0;
    for (int i = 0; i < n; i++) {
      add(i);
      haveIn++;
      if (press_button() > mid) {
        rem(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...