Submission #1203138

#TimeUsernameProblemLanguageResultExecution timeMemory
1203138The_SamuraiCounting Mushrooms (IOI20_mushrooms)C++20
10 / 100
50 ms532 KiB
#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 timeMemoryGrader output
Fetching results...