Submission #461205

#TimeUsernameProblemLanguageResultExecution timeMemory
461205denniskimCounting Mushrooms (IOI20_mushrooms)C++14
100 / 100
9 ms432 KiB
//mushrooms.cpp #include "mushrooms.h" #include <bits/stdc++.h> using namespace std; typedef int ll; typedef double ld; #define MAX 9223372036854775807LL #define MIN -9223372036854775808LL int count_mushrooms(int n) { if(n <= 200) { ll ans = 1; vector<ll> tmp; for(ll i = 1 ; i < n - 1 ; i += 2) { tmp.clear(); tmp.push_back(i + 1); tmp.push_back(0); tmp.push_back(i); ans += 2 - use_machine(tmp); } if(n % 2 == 0) { tmp.clear(); tmp.push_back(0); tmp.push_back(n - 1); ans += 1 - use_machine(tmp); } return ans; } //0 ~ 4 vector<ll> A, B; vector<ll> tmp; tmp.push_back(0); tmp.push_back(1); A.push_back(0); if(use_machine(tmp) == 1) B.push_back(1); else A.push_back(1); tmp.clear(); tmp.push_back(0); tmp.push_back(2); if(use_machine(tmp) == 1) B.push_back(2); else A.push_back(2); if(A.size() >= 2) { tmp.clear(); tmp.push_back(A[0]); tmp.push_back(3); tmp.push_back(A[1]); tmp.push_back(4); ll gap = use_machine(tmp); if(gap % 2 == 0) A.push_back(4); else B.push_back(4); if(gap / 2 == 0) A.push_back(3); else B.push_back(3); } else { tmp.clear(); tmp.push_back(B[0]); tmp.push_back(3); tmp.push_back(B[1]); tmp.push_back(4); ll gap = use_machine(tmp); if(gap % 2 == 0) B.push_back(4); else A.push_back(4); if(gap / 2 == 0) B.push_back(3); else A.push_back(3); } ll buck = 45; for(ll i = 1 ; i < buck ; i++) { ll bun1 = 5 * i; ll bun2 = 5 * i + 1; ll bun3 = 5 * i + 2; ll bun4 = 5 * i + 3; ll bun5 = 5 * i + 4; if(A.size() >= 3) { tmp.clear(); tmp.push_back(A[0]); tmp.push_back(bun1); tmp.push_back(A[1]); tmp.push_back(bun2); tmp.push_back(A[2]); tmp.push_back(bun3); ll gap = use_machine(tmp); if(gap < 2) { //bun1 = 0, bun2 = 0 A.push_back(bun1); A.push_back(bun2); if(gap % 2 == 0) A.push_back(bun3); else B.push_back(bun3); tmp.clear(); tmp.push_back(A[0]); tmp.push_back(bun4); tmp.push_back(A[1]); tmp.push_back(bun5); gap = use_machine(tmp); if(gap % 2 == 0) A.push_back(bun5); else B.push_back(bun5); if(gap / 2 == 0) A.push_back(bun4); else B.push_back(bun4); } else if(gap >= 4) { //bun1 = 1, bun2 = 1 B.push_back(bun1); B.push_back(bun2); if(gap % 2 == 0) A.push_back(bun3); else B.push_back(bun3); tmp.clear(); tmp.push_back(A[0]); tmp.push_back(bun4); tmp.push_back(A[1]); tmp.push_back(bun5); gap = use_machine(tmp); if(gap % 2 == 0) A.push_back(bun5); else B.push_back(bun5); if(gap / 2 == 0) A.push_back(bun4); else B.push_back(bun4); } else { //bun1 != bun2, bun3 OK if(gap % 2 == 0) A.push_back(bun3); else B.push_back(bun3); if(B.size() < 2) { tmp.clear(); tmp.push_back(A[0]); tmp.push_back(bun1); tmp.push_back(A[1]); tmp.push_back(bun2); ll gapp = use_machine(tmp); if(gapp % 2 == 0) A.push_back(bun2); else B.push_back(bun2); if(gapp / 2 == 0) A.push_back(bun1); else B.push_back(bun1); tmp.clear(); tmp.push_back(A[0]); tmp.push_back(bun4); tmp.push_back(A[1]); tmp.push_back(bun5); gapp = use_machine(tmp); if(gapp % 2 == 0) A.push_back(bun5); else B.push_back(bun5); if(gapp / 2 == 0) A.push_back(bun4); else B.push_back(bun4); } else { tmp.clear(); tmp.push_back(B[0]); tmp.push_back(bun1); tmp.push_back(B[1]); tmp.push_back(A[0]); tmp.push_back(bun2); tmp.push_back(A[1]); tmp.push_back(bun4); tmp.push_back(A[2]); tmp.push_back(bun5); ll gapp = use_machine(tmp) - 1; if(gapp % 2 == 0) A.push_back(bun5); else B.push_back(bun5), gapp--; if(gapp == 0) { B.push_back(bun1); A.push_back(bun2); A.push_back(bun4); } else if(gapp == 2) { B.push_back(bun1); A.push_back(bun2); B.push_back(bun4); } else if(gapp == 4) { A.push_back(bun1); B.push_back(bun2); A.push_back(bun4); } else if(gapp == 6) { A.push_back(bun1); B.push_back(bun2); B.push_back(bun4); } } } } else if(B.size() >= 3) { tmp.clear(); tmp.push_back(B[0]); tmp.push_back(bun1); tmp.push_back(B[1]); tmp.push_back(bun2); tmp.push_back(B[2]); tmp.push_back(bun3); ll gap = use_machine(tmp); if(gap < 2) { //bun1 = 1, bun2 = 1 B.push_back(bun1); B.push_back(bun2); if(gap % 2 == 0) B.push_back(bun3); else A.push_back(bun3); tmp.clear(); tmp.push_back(B[0]); tmp.push_back(bun4); tmp.push_back(B[1]); tmp.push_back(bun5); gap = use_machine(tmp); if(gap % 2 == 0) B.push_back(bun5); else A.push_back(bun5); if(gap / 2 == 0) B.push_back(bun4); else A.push_back(bun4); } else if(gap >= 4) { //bun1 = 0, bun2 = 0 A.push_back(bun1); A.push_back(bun2); if(gap % 2 == 0) B.push_back(bun3); else A.push_back(bun3); tmp.clear(); tmp.push_back(B[0]); tmp.push_back(bun4); tmp.push_back(B[1]); tmp.push_back(bun5); gap = use_machine(tmp); if(gap % 2 == 0) B.push_back(bun5); else A.push_back(bun5); if(gap / 2 == 0) B.push_back(bun4); else A.push_back(bun4); } else { //bun1 != bun2, bun3 OK if(gap % 2 == 0) B.push_back(bun3); else A.push_back(bun3); if(A.size() < 2) { tmp.clear(); tmp.push_back(B[0]); tmp.push_back(bun1); tmp.push_back(B[1]); tmp.push_back(bun2); ll gapp = use_machine(tmp); if(gapp % 2 == 0) B.push_back(bun2); else A.push_back(bun2); if(gapp / 2 == 0) B.push_back(bun1); else A.push_back(bun1); tmp.clear(); tmp.push_back(B[0]); tmp.push_back(bun4); tmp.push_back(B[1]); tmp.push_back(bun5); gapp = use_machine(tmp); if(gapp % 2 == 0) B.push_back(bun5); else A.push_back(bun5); if(gapp / 2 == 0) B.push_back(bun4); else A.push_back(bun4); } else { tmp.clear(); tmp.push_back(A[0]); tmp.push_back(bun1); tmp.push_back(A[1]); tmp.push_back(B[0]); tmp.push_back(bun2); tmp.push_back(B[1]); tmp.push_back(bun4); tmp.push_back(B[2]); tmp.push_back(bun5); ll gapp = use_machine(tmp) - 1; if(gapp % 2 == 0) B.push_back(bun5); else A.push_back(bun5), gapp--; if(gapp == 0) { A.push_back(bun1); B.push_back(bun2); B.push_back(bun4); } else if(gapp == 2) { A.push_back(bun1); B.push_back(bun2); A.push_back(bun4); } else if(gapp == 4) { B.push_back(bun1); A.push_back(bun2); B.push_back(bun4); } else if(gapp == 6) { B.push_back(bun1); A.push_back(bun2); A.push_back(bun4); } } } } } ll gaet = 0; ll num = 0; ll ans = A.size(); for(ll i = 5 * buck ; i < n ; i += gaet) { if(A.size() >= B.size()) { gaet = A.size(); num = 0; } else { gaet = B.size(); num = 1; } tmp.clear(); ll siz = gaet; ll cc = 0; if(i + siz > n) siz = n - i; for(ll j = i ; j < i + siz ; j++) { if(num == 0) tmp.push_back(A[cc++]); else tmp.push_back(B[cc++]); tmp.push_back(j); } ll gappp = use_machine(tmp); if(num == 0) ans += siz - (gappp + 1) / 2; else ans += (gappp + 1) / 2; if(num == 0) { if(gappp % 2 == 0) A.push_back(i + siz - 1); else B.push_back(i + siz - 1); } else { if(gappp % 2 == 0) B.push_back(i + siz - 1); else A.push_back(i + siz - 1); } } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...