#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();
if (max(zero.size(), one.size()) < need) {
return zero.size() + (1 - use_machine({0, i}));
}
vector<int> unused;
for (; i < n; i++) unused.emplace_back(i);
int ans = zero.size();
if (zero.size() == need) {
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... |