Submission #838750

#TimeUsernameProblemLanguageResultExecution timeMemory
838750taher드문 곤충 (IOI22_insects)C++17
99.89 / 100
51 ms424 KiB
#include "insects.h"
#include <bits/stdc++.h>

using namespace std;

int min_cardinality(int N) {
  int n = N;
  vector<int> in(n);
  
  vector<int> roots;
  for (int i = 0; i < n; i++) {
    move_inside(i);
    if (press_button() == 2) {
      move_outside(i); 
    } else {
      roots.push_back(i);
      in[i] = true; 
    }
  }
  assert((int) roots.size() > 0);
  
  if ((int) roots.size() == 1) {
    return n; 
  }
  
  int base = (int) roots.size();
  vector<int> possible;
  for (int i = 0; i < n; i++) {
    possible.push_back(i); 
  }
  
  vector<int> max_value(n);
  vector<int> min_value(n, 1234567);
 
  auto Check = [&](int mid) {
    vector<int> tmp;
    for (int id = 0; id < (int) possible.size(); id++) {
      int i = possible[id];
      if (in[i] || max_value[i] > mid) {
        continue; 
      }
      move_inside(i);
      
      if (min_value[i] < mid) {
        tmp.push_back(i);
        roots.push_back(i);
        in[i] = true; 
      } else {
        if (press_button() > mid) {
          max_value[i] = max(max_value[i], mid);
          move_outside(i);
        } else {
          min_value[i] = min(min_value[i], mid);
          tmp.push_back(i);
          roots.push_back(i);
          in[i] = true;
        }
      }
    }
    if ((int) roots.size() == base * mid) {
      sort(roots.begin(), roots.end());
      return true;
    }
    possible = roots;
    for (int i = 0; i < (int) tmp.size(); i++) {
      roots.pop_back(); 
      in[tmp[i]] = false;
      move_outside(tmp[i]);
    }
    sort(roots.begin(), roots.end());
    sort(possible.begin(), possible.end());
    return false;
  };
  
  int low = 2;
  int high = n / (int) roots.size();
  
  while (low <= high) {
    int mid = low + (high - low) / 2;
    
    if (Check(mid)) {
      low = mid + 1;
    } else  {
      high = mid - 1; 
    } 
  }
  --low;
  return low;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...