Submission #824005

#TimeUsernameProblemLanguageResultExecution timeMemory
824005drdilyorCounting Mushrooms (IOI20_mushrooms)C++17
0 / 100
2 ms208 KiB
#include<bits/stdc++.h> #include "mushrooms.h" using namespace std; using ll = long long; int count_mushrooms(int n) { const int B = 281; // sqrt(4n) vector<int> t(n); t[1] = use_machine({0, 1}); if (n == 2) return 2 - t[1] - t[0]; t[2] = use_machine({0, 2}); bool inv = false; int cmp1, cmp2; if (t[1] && t[2]) { cmp1 = 1; cmp2 = 2; inv = true; t[0] ^= 1; t[1] ^= 1; t[2] ^= 1; } else { cmp1 = 0; if (!t[1]) cmp2 = 1; else cmp2 = 2; } for (int i = 3; i < n-1 && i < B; i += 2) { int res = use_machine({cmp1, i, cmp2, i+1}); t[i] = res / 2; t[i+1] = res % 2; } if (inv) for (int& i : t) i ^= 1; if (n < B && n % 2 == 0) t[n-1] = use_machine({0, n-1}); int ans = n - accumulate(t.begin(), t.end(), 0); if (n <= B) return ans; vector<int> As, Bs; for (int i = 0; i < B; i++) { if (t[i] == 0) As.push_back(i); else Bs.push_back(i); } vector<int> grp = As.size() > Bs.size() ? As : Bs; for (int j = B; j < n; j += B / 2) { vector<int> inter; for (int k = j; k < n && k < j + B / 2; k++) inter.push_back(j); vector<int> cur; for (int i = 0; i < (int)inter.size(); i++) { cur.push_back(grp[i]); cur.push_back(inter[i]); } cur.push_back(grp[inter.size()]); int cnt = use_machine(cur); assert(cnt % 2 == 0); cnt /= 2; if (grp == Bs) { ans += cnt; } else { ans += inter.size() - cnt; } } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...