Submission #308524

#TimeUsernameProblemLanguageResultExecution timeMemory
308524CodePlatinaCounting Mushrooms (IOI20_mushrooms)C++14
100 / 100
11 ms576 KiB
#include "mushrooms.h" #include <vector> using namespace std; const int K = 100; int count_mushrooms(int n) { if(n <= 453) { 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, D, E; A.push_back(0); for(int i = 1; i < n; ++i) C.push_back(i); while(A.size() < K && B.size() < K && A.size() + B.size() + D.size() < 2 * K - 1) { if(A.size() >= 3) { int x = C.back(); C.pop_back(); int y = C.back(); C.pop_back(); int z = C.back(); C.pop_back(); int t = use_machine({A[0], x, A[1], y, A[2], z}); if(t & 1) B.push_back(z); else A.push_back(z); if(t / 2 == 0) A.push_back(x), A.push_back(y); else if(t / 2 == 2) B.push_back(x), B.push_back(y); else if(B.size() >= 2) { int u = C.back(); C.pop_back(); int v = C.back(); C.pop_back(); t = use_machine({B[0], x, B[1], A[0], y, A[1], u, A[2], v}) - 1; if(t & 1) B.push_back(v); else A.push_back(v); if(t >> 1 & 1) B.push_back(u); else A.push_back(u); if(t >> 2) A.push_back(x), B.push_back(y); else B.push_back(x), A.push_back(y); } else { D.push_back(x); E.push_back(y); } } else if(B.size() >= 3) { int x = C.back(); C.pop_back(); int y = C.back(); C.pop_back(); int z = C.back(); C.pop_back(); int t = use_machine({B[0], x, B[1], y, B[2], z}); if(t & 1) A.push_back(z); else B.push_back(z); if(t / 2 == 0) B.push_back(x), B.push_back(y); else if(t / 2 == 2) A.push_back(x), A.push_back(y); else if(A.size() >= 2) { int u = C.back(); C.pop_back(); int v = C.back(); C.pop_back(); t = use_machine({A[0], x, A[1], B[0], y, B[1], u, B[2], v}) - 1; if(t & 1) A.push_back(v); else B.push_back(v); if(t >> 1 & 1) A.push_back(u); else B.push_back(u); if(t >> 2) B.push_back(x), A.push_back(y); else A.push_back(x), B.push_back(y); } else { D.push_back(x); E.push_back(y); } } else 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); } if(D.size() == 2) { if(A.size() >= 2) { int t = use_machine({A[0], D[0], A[1], D[1]}); if(t / 2) B.push_back(D[0]), A.push_back(E[0]); else A.push_back(D[0]), B.push_back(E[0]); if(t & 1) B.push_back(D[1]), A.push_back(E[1]); else A.push_back(D[1]), B.push_back(E[1]); } else { int t = use_machine({B[0], D[0], B[1], D[1]}); if(t / 2) A.push_back(D[0]), B.push_back(E[0]); else B.push_back(D[0]), A.push_back(E[0]); if(t & 1) A.push_back(D[1]), B.push_back(E[1]); else B.push_back(D[1]), A.push_back(E[1]); } D.clear(); E.clear(); } } if(D.size() == 1) { int x = C.back(); C.pop_back(); int t = use_machine({A[0], x, A[1], D[0]}); if(t & 1) B.push_back(D[0]), A.push_back(E[0]); else A.push_back(D[0]), B.push_back(E[0]); if(t / 2) 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...