#include "mushrooms.h"
#include "bits/stdc++.h"
using namespace std;
int count_mushrooms(int n) {
	// if (n <= 227) {
	// 	int ans = 1;
	// 	for (int i = 1; i < n; i++) ans += 1 - use_machine({0, i});
	// 	return ans;
	// }
	vector<int> zero = {0}, one;
	int i = 1, need = 100;
	while (i < n and zero.size() < 2 and one.size() < 2) {
		if (use_machine({0, i})) one.emplace_back(i);
		else zero.emplace_back(i);
		i++;
	}
	if (i == n) return zero.size();
	if (zero.size() == 2) {
		while (i + 1 < n and zero.size() < need and one.size() < need) {
			int val = use_machine({zero[0], i, zero[1], i + 1});
			if (val & 2) one.emplace_back(i);
			else zero.emplace_back(i);
			if (val & 1) one.emplace_back(i + 1);
			else zero.emplace_back(i + 1);
			i += 2;
		}
	} else {
		while (i + 1 < n and zero.size() < need and one.size() < need) {
			int val = use_machine({one[0], i, one[1], i + 1});
			if (val & 2) zero.emplace_back(i);
			else one.emplace_back(i);
			if (val & 1) zero.emplace_back(i + 1);
			else one.emplace_back(i + 1);
			i += 2;
		}
	}
	if (i == n) return zero.size();
	vector<int> unused;
	for (; i < n; i++) unused.emplace_back(i);
	int ans = zero.size();
	if (zero.size() > one.size()) {
		while (!unused.empty()) {
			int ln = min(unused.size(), zero.size());
			vector<int> v;
			for (int i = 0; i < ln; i++) {
				v.emplace_back(zero[i]);
				v.emplace_back(unused.back());
				unused.pop_back();
			}
			ans += ln - (use_machine(v) + 1) / 2;
		}
	} else {
		while (!unused.empty()) {
			int ln = min(unused.size(), one.size());
			vector<int> v;
			for (int i = 0; i < ln; i++) {
				v.emplace_back(one[i]);
				v.emplace_back(unused.back());
				unused.pop_back();
			}
			ans += (use_machine(v) + 1) / 2;
		}
	}
	return ans;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |