Submission #308421

#TimeUsernameProblemLanguageResultExecution timeMemory
308421CodePlatinaCounting Mushrooms (IOI20_mushrooms)C++14
81.59 / 100
9 ms512 KiB
#include "mushrooms.h" #include <vector> using namespace std; const int K = 181; int count_mushrooms(int n) { if(n <= 452) { int ret = 1; for(int i = 1; i < n; i += 2) { if(i == n - 1) ret += 1 - use_machine({0, i}); else ret += 2 - use_machine({i, 0, i + 1}); } return ret; } else { int ret = 0; vector<int> A, B, C; A.push_back(0); for(int i = 1; i < n; ++i) C.push_back(i); while(A.size() < K && B.size() < K) { if(A.size() >= 2) { int x = C.back(); C.pop_back(); int y = C.back(); C.pop_back(); int t = use_machine({A[0], x, A[1], y}); if(t & 1) B.push_back(y); else A.push_back(y); if(t / 2) B.push_back(x); else A.push_back(x); } else if(B.size() >= 2) { int x = C.back(); C.pop_back(); int y = C.back(); C.pop_back(); int t = use_machine({B[0], x, B[1], y}); if(t & 1) A.push_back(y); else B.push_back(y); if(t / 2) A.push_back(x); else B.push_back(x); } else { int x = C.back(); C.pop_back(); int t = use_machine({A[0], x}); if(t) B.push_back(x); else A.push_back(x); } } while(C.size()) { if(A.size() >= B.size()) { int cnt = -1; vector<int> tmp; for(int i = 0; (int)C.size() && i < (int)A.size(); ++i) { ++cnt; tmp.push_back(A[i]); tmp.push_back(C.back()); C.pop_back(); } int t = use_machine(tmp); if(t & 1) --t, B.push_back(tmp.back()); else A.push_back(tmp.back()); ret += cnt - t / 2; } else { int cnt = -1; vector<int> tmp; for(int i = 0; (int)C.size() && i < (int)B.size(); ++i) { ++cnt; tmp.push_back(B[i]); tmp.push_back(C.back()); C.pop_back(); } int t = use_machine(tmp); if(t & 1) --t, A.push_back(tmp.back()); else B.push_back(tmp.back()); ret += t / 2; } } return ret + A.size(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...