Submission #1277556

#TimeUsernameProblemLanguageResultExecution timeMemory
127755612345678Rarest Insects (IOI22_insects)C++17
99.83 / 100
18 ms480 KiB

void move_inside(int i);
void move_outside(int i);
int press_button();
int min_cardinality(int N);

#include <iostream>
#include <vector>
#include <set>
#include <map>
int size;
int type;
bool markBS[2010];
std::set<int> ins;
int cnt=0;

bool bs(int lim){
  for(int i=0;i<size;i++){
    if(markBS[i])continue;
    move_inside(i);
    if(press_button()>lim){
      move_outside(i);
    }
    else{
      cnt+=1;
      ins.insert(i);
    }
    if(cnt>=lim*type){
      for(auto mu:ins){
        markBS[mu]=true;
      }
      return true;
    }
    //std::cout <<cnt << '*';
  }
  for (int i=0; i<size; i++) if (ins.find(i)==ins.end()) markBS[i]=1;
  std::vector<int> tmp;
  for(auto mu:ins){
    if (markBS[mu]) continue;
    tmp.push_back(mu);
    move_outside(mu);
    cnt-=1;
  }
  for (auto x:tmp) ins.erase(x);
  return false;
}

int pbv;

int minL(){
  int count = 0;
  for(int i=0;i<size;i++){
    move_inside(i);
    pbv = press_button();
    if(pbv>1){
      move_outside(i);
    }
    else{
      count+=1;
      markBS[i]=true;
      cnt+=1;
    }
  }
  return count;
}
int min_cardinality(int N) {
  size=N;
  type = minL();
  if(type==1)return size;
  int l=1,r=1+(size/type);
  int bstUse = 0;
  while(l<r){
    bstUse+=1;
    int mid = (l+r+1)/2;
    if(bs(mid)){
      l=mid;
    }
    else{
      r=mid-1;
    }
    //std::cout << cnt  << ' ' << l << ' ' << mid << ' ' << r << '\n';
  }
  //std::cout << bstUse <<"*\n";
  return l;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...