Submission #776658

#TimeUsernameProblemLanguageResultExecution timeMemory
776658SanguineChameleon드문 곤충 (IOI22_insects)C++17
61.93 / 100
139 ms464 KiB
#include "insects.h"
#include <bits/stdc++.h>
using namespace std;

const int maxN = 2e3 + 20;
int order[maxN];
int pref[maxN];
vector<int> diff;
vector<int> cnt;
mt19937 gen(69420);
int res;

void solve(int lt, int rt, vector<int> rem, bool on) {
	if (res == 1) {
		return;
	}
	if (lt == rt) {
		cnt[lt] += (int)rem.size();
		return;
	}
	if (rem.empty()) {
		res = 1;
		return;
	}
	int mt = (lt + rt) / 2;
	bool all_left = true;
	for (auto x: rem) {
		all_left &= (pref[x] <= mt);
	}
	if (all_left) {
		solve(lt, mt, rem, on);
		return;
	}
	if (on) {
		for (int i = mt + 1; i <= rt; i++) {
			if (diff[i] == -1) {
				continue;
			}
			move_outside(diff[i]);
		}
		vector<int> left_rem;
		vector<int> right_rem;
		for (auto x: rem) {
			if (pref[x] <= mt) {
				left_rem.push_back(x);
				continue;
			}
			move_inside(x);
			if (press_button() == 2) {
				left_rem.push_back(x);
			}
			else {
				right_rem.push_back(x);
			}
			move_outside(x);
		}
		solve(lt, mt, left_rem, true);
		solve(mt + 1, rt, right_rem, false);
	}
	else {
		for (int i = mt + 1; i <= rt; i++) {
			if (diff[i] == -1) {
				continue;
			}
			move_inside(diff[i]);
		}
		vector<int> left_rem;
		vector<int> right_rem;
		for (auto x: rem) {
			if (pref[x] <= mt) {
				left_rem.push_back(x);
				continue;
			}
			move_inside(x);
			if (press_button() == 2) {
				right_rem.push_back(x);
			}
			else {
				left_rem.push_back(x);
			}
			move_outside(x);
		}
		solve(lt, mt, left_rem, false);
		solve(mt + 1, rt, right_rem, true);
	}
}

int min_cardinality(int N) {
	for (int i = 0; i < N; i++) {
		order[i] = i;
	}
	//reverse(order, order + N);
	shuffle(order, order + N, gen);
	diff.push_back(order[0]);
	move_inside(order[0]);
	vector<int> rem;
	for (int i = 1; i < N; i++) {
		move_inside(order[i]);
		if (press_button() == 1) {
			diff.push_back(order[i]);
		}
		else {
			pref[order[i]] = (int)diff.size() - 1;
			rem.push_back(order[i]);
			move_outside(order[i]);
		}
	}
	cnt.resize(diff.size(), 1);
	res = N + 1;
	solve(0, (int)diff.size() - 1, rem, true);
	for (auto x: cnt) {
		res = min(res, x);
	}
	return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...