Submission #956141

#TimeUsernameProblemLanguageResultExecution timeMemory
956141n1k드문 곤충 (IOI22_insects)C++17
61.06 / 100
91 ms1688 KiB
#include "insects.h"
#include <bits/stdc++.h>

using namespace std;

const int LOG = 12;
int n;

vector<set<int>> active(LOG);
vector<int> v;

void build(int lb, int rb, int level){
	if(lb>=rb) return;
	int mb = (lb + rb) / 2;
	for(int i=lb; i<=mb; i++){
		active[level].insert(v[i]);
	}
	build(lb, mb, level+1);
	build(mb+1, rb, level+1);

}

int min_cardinality(int N) {
	n = N;

	vector<int> rest;

	for(int i=0; i<n; i++){
		move_inside(i);
		v.push_back(i);
		if(press_button()>=2){
			move_outside(i);
			v.pop_back();
			rest.push_back(i);
		}
	}

	build(0, v.size()-1, 0);
	int m=n-v.size();

	vector<int> lb(m), rb(m, v.size()-1), count(v.size(), 1);
	set<int> cur(v.begin(), v.end());

	for(int level=0; level<LOG; level++){
		// activate
		for(auto x:active[level]){
			if(not cur.count(x)){
				cur.insert(x);
				move_inside(x);
			}
		}
		auto c_cur=cur;;
		// deactivate
		for(auto x:c_cur){
			if(not active[level].count(x)){
				cur.extract(x);
				move_outside(x);
			}
		}
		// query
		for(int i=0; i<m; i++){
			if(lb[i]>=rb[i]) continue;
			int mb = (lb[i] + rb[i])/2;
			move_inside(rest[i]);
			if(press_button()==2){
				rb[i]=mb;
			}else{
				lb[i]=mb+1;
			}
			move_outside(rest[i]);
		}
	}

	for(int i=0; i<m; i++){
		count[lb[i]]++;
	}

	return *min_element(count.begin(), count.end());
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...