제출 #1273502

#제출 시각아이디문제언어결과실행 시간메모리
1273502jump드문 곤충 (IOI22_insects)C++20
0 / 100
1 ms400 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>
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++){
    markBS[i]=true;
  }
  for(auto mu:ins){
    markBS[mu]=false;
    move_outside(mu);
    cnt-=1;
  }
  ins.clear();
  return false;
}

int pbv;
std::set<int> clearList;
int clear(){
  for(auto c:clearList){
    move_outside(c);
  }
  clearList.clear();
  return 0;
}
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;
      clearList.insert(i);
    }
  }
  clear();
  return count;
}
int min_cardinality(int N) {
  size=N;
  type = minL();
  if(type==size)return 1;
  int l=1,r=size/2;
  while(l<r){
    int mid = (l+r+1)/2;
    if(bs(mid)){
      l=mid;
    }
    else{
      r=mid-1;
    }
    //std::cout << cnt  << ' ' << l << ' ' << mid << ' ' << r << '\n';
  }
  return l;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...