# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1058521 | 2024-08-14T10:31:34 Z | epicci23 | 드문 곤충 (IOI22_insects) | C++17 | 0 ms | 0 KB |
#include "bits/stdc++.h" #include "insects.h" #define all(v) v.begin() , v.end() #define sz(a) (int)a.size() using namespace std; vector<int> mach; void clear_mach(){ while(!mach.empty()){ move_outside(mach.back()); mach.pop_back(); } } int solve_paralel(vector<int> cand){ if(sz(cand)==1) return 1; mach.push_back(0); move_inside(0); vector<int> tk,hm; tk.push_back(0); for(int i=1;i<sz(cand);i++){ move_inside(i); mach.push_back(i); if(press_button()==1) tk.push_back(i); else{ hm.push_back(i); move_outside(i); mach.pop_back(); } } int n=sz(tk),m=sz(hm); if(n==1) return sz(cand); if(m<n) return 1; int L[m],R[m]; for(int i=0;i<m;i++){ L[i]=0; R[i]=n-1; } for(int j=0;j<=__lg(n);j++){ clear_mach(); vector<int> dene[n]; for(int i=0;i<m;i++) if(L[i]!=R[i]) dene[(L[i]+R[i])/2].push_back(i); for(int i=0;i<n;i++){ move_inside(tk[i]); mach.push_back(tk[i]); for(int x:dene[i]){ move_inside(hm[x]); mach.push_back(hm[x]); if(press_button()==2) R[x]=i; else L[x]=i+1; move_outside(hm[x]); mach.pop_back(); } } } int ans=sz(cand); vector<int> mark(n,1); for(int i=0;i<m;i++) mark[L[i]]++; for(int i=0;i<n;i++) ans=min(ans,mark[i]); return ans; } int check_ans(vector<int> cand,int l,int r){ int K = l+sqrtl(r-l); clear_mach(); mach.push_back(0); move_inside(0); vector<int> takla; for(int i=1;i<sz(cand);i++){ mach.push_back(i); move_inside(i); if(press_button()>=K){ takla.push_back(i); move_outside(i); mach.pop_back(); } } clear_mach(); for(int x:takla){ move_inside(x); mach.push_back(x); if(press_button()==2){ move_outside(x); mach.pop_back(); } } vector<int> buyuk,kucuk; for(int x:takla) buyuk.push_back(x); clear_mach(); for(int x:cand){ move_inside(x); mach.push_back(x); if(press_button()==2) buyuk.push_back(x); else kucuk.push_back(x); move_outside(x); mach.pop_back(); } if(kucuk.empty()) return solve_paralel(cand); else return check_ans(cand,l,K-1); } int min_cardinality(int n){ vector<int> res; for(int i=0;i<n;i++) res.push_back(i); return check_ans(res); } /*void _(){ } int32_t main(){ cin.tie(0); ios::sync_with_stdio(0); int tc=1;//cin >> tc; while(tc--) _(); return 0; }*/