Submission #835460

#TimeUsernameProblemLanguageResultExecution timeMemory
835460pavementRarest Insects (IOI22_insects)C++17
90.30 / 100
181 ms520 KiB
#include "insects.h"
#include <bits/stdc++.h>
using namespace std;

#define pb push_back

int N;
vector<int> machine;
vector<bool> in_set;

void my_move_inside(int x) {
	in_set[x] = 1;
}

void my_move_outside(int x) {
	in_set[x] = 0;
}

int my_press_button() {
	vector<int> cur;
	for (int i = 0; i < N; i++) {
		if (in_set[i]) {
			cur.pb(i);
		}
	}
	vector<int> tmp;
	set_symmetric_difference(cur.begin(), cur.end(), machine.begin(), machine.end(), back_inserter(tmp));
	sort(cur.begin(), cur.end());
	for (auto i : tmp) {
		if (binary_search(cur.begin(), cur.end(), i)) {
			move_inside(i);
		} else {
			move_outside(i);
		}
	}
	machine = cur;
	return press_button();
}

int min_cardinality(int N) {
	::N = N;
	in_set.resize(N);
	vector<int> v, alr_in;
	my_move_inside(0);
	v.pb(0);
	for (int i = 1; i < N; i++) {
		my_move_inside(i);
		if (my_press_button() != 1) {
			my_move_outside(i);
		} else {
			v.pb(i);
		}
	}
	vector<int> insects;
	insects.resize(N);
	iota(insects.begin(), insects.end(), 0);
	int lo = 1, hi = N / (int)v.size(), ans = -1;
	while (lo <= hi) {
		int mid = (lo + hi) / 2;
		vector<int> to_remove = alr_in;
		for (int i : insects) {
			if (!binary_search(v.begin(), v.end(), i) && !binary_search(alr_in.begin(), alr_in.end(), i)) {
				my_move_inside(i);
				if (my_press_button() > mid) {
					my_move_outside(i);
				} else {
					to_remove.pb(i);
				}
			}
		}
		if ((int)to_remove.size() == (int)v.size() * (mid - 1)) {
			ans = mid;
			lo = mid + 1;
			alr_in = to_remove;
			sort(alr_in.begin(), alr_in.end());
		} else {
			insects = v;
			hi = mid - 1;
			for (auto i : to_remove) {
				my_move_outside(i);
				insects.pb(i);
			}
			alr_in.clear();
		}		
	}
	return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...