Submission #1334952

#TimeUsernameProblemLanguageResultExecution timeMemory
1334952WongYiKaiRarest Insects (IOI22_insects)C++20
0 / 100
0 ms344 KiB
#include "insects.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int inside[2005], kys[2005];

void in(ll x){
  inside[x] = 1;
  move_inside(x);
}

void out(ll x){
  inside[x] = 0;
  move_outside(x);
}

ll count(){
  ll cnt = 0;
  for (int i=0;i<2005;i++){
    if (inside[i]) cnt++;
  }
  return cnt;
}

vector<ll> added;

ll check(ll m, int n, ll prev){
  if (prev < m){
    added.clear();
    for (int i=0;i<n;i++){
      if (inside[i] || kys[i]) continue;
      in(i);
      if (press_button() > m) out(i);
      else added.push_back(i);
    }
  }
  else{
    vector<ll> arr;
    for (int i:added){
      if (!inside[i]) continue;
      out(i);
      arr.push_back(i);
    }
    added.clear();
    for (int i=0;i<arr.size();i++){
      in(arr[i]);
      if (press_button() > m) out(arr[i]);
      else added.push_back(arr[i]);
    }
    arr.clear();
  }
  return count();
}

int min_cardinality(int n) {
  in(0);
  added.push_back(0);
  for (int i=1;i<n;i++){
    in(i);
    if (press_button() > 1) out(i);
    else added.push_back(i);
  }
  ll group = count();
  ll l = 1, r = n/group;
  ll checked[r+1];
  memset(checked,-1,sizeof(checked));
  checked[1] = 1;
  ll prev = 1;
  while (l<r){
    ll m = (l+r)>>1;
    if (checked[m] == -1){
      ll cnt = check(m, n, prev);
      prev = m;
      checked[m] = cnt;
    }
    if (group*m == checked[m]) l = m+1;
    else {
      r = m;
      for (int i=0;i<n;i++){
        if (!inside[i]) kys[i] = 1;
      }
    }
  }
  return l-1;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...