# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1235722 | MuhammadSaram | 드문 곤충 (IOI22_insects) | C++20 | 0 ms | 0 KiB |
#include "insects.h"
#include <bits/stdc++.h>
using namespace std;
#define get press_button
set<int> se;
void add(int u)
{
if (se.count(u)) return;
move_inside(u), se.insert(u);
}
void rem(int u)
{
if (!se.count(u)) return;
move_outside(u), se.erase(u);
}
int min_cardinality(int n)
{
vector<int> v={0};
add(0);
for (int i=1;i<n;i++)
{
add(i), v.push_back(i);
if (get()==2)
rem(i),v.pop_back();
}
if (v.size()>250)
{
bool vis[n]={};
int ans=0, t=v.size();
while (1)
{
ans++;
for (int i:v) vis[i]=1;
while (!v.empty()) rem(v.back()), v.pop_back();
for (int i=0;i<n;i++)
{
if (vis[i]) continue;
add(i), v.push_back(i);
if (get()==2) rem(i), v.pop_back();
}
if (v.size()<t) break;
}
return ans;
}
else
{
if (v[i].empty()) return 1/0;
int l[n], r[n];
vector<int> mid[n];
for (int i=0;i<n;i++)
if (!se.count(i))
l[i]=-1, r[i]=(int)v.size()-1, mid[(l[i]+r[i])/2].push_back(i);
for (int i=0;i<v.size();i++)
l[v[i]]=i-1,r[v[i]]=i;
for (int ct=0;ct<8;ct++)
{
bool it=0;
for (int i=0;i<n;i++)
if (l[i]+1<r[i]) it=1;
if (!it) break;
for (int i:v) rem(i);
for (int i=0;i<v.size();i++)
{
add(v[i]);
for (int x:mid[i])
{
add(x);
if (get()==2) r[x]=i;
else l[x]=i;
rem(x);
mid[(l[x]+r[x])/2].push_back(x);
}
mid[i].clear();
}
}
map<int,int> cnt;
for (int i=0;i<n;i++)
cnt[r[i]]++;
int ans=n;
for (auto [i,x]:cnt) ans=min(ans,x);
return ans;
}
}