Submission #805494

#TimeUsernameProblemLanguageResultExecution timeMemory
805494PixelCatCounting Mushrooms (IOI20_mushrooms)C++14
90.76 / 100
9 ms360 KiB
#include "mushrooms.h" #ifdef NYAOWO #include "stub.cpp" #endif #include <bits/stdc++.h> #define For(i, a, b) for(int i = a; i <= b; i++) #define Forr(i, a, b) for(int i = a; i >= b; i--) #define F first #define S second #define all(x) x.begin(), x.end() #define sz(x) ((int)x.size()) #define eb emplace_back // #define int LL using namespace std; using i32 = int32_t; using LL = long long; using pii = pair<int, int>; pii alter(vector<int> jury, vector<int> sus, bool flip) { assert(sz(jury) >= sz(sus)); vector<int> q; int n = sz(sus); while(sz(sus)) { q.eb(jury.back()); jury.pop_back(); q.eb(sus.back()); sus.pop_back(); } int res = use_machine(q); int cnt = (res + 1) / 2; if(flip) return pii(cnt, 1 - res % 2); return pii(n - cnt, res % 2); } pii ask2(int j1, int j2, int x1, int x2, int flip) { int cnt = use_machine({j1, x1, j2, x2}); pii res; res.F = ((cnt & 2) != 0); res.S = ((cnt & 1) != 0); if(flip) { res.F = 1 - res.F; res.S = 1 - res.S; } return res; } int count_mushrooms(int n) { if(n <= 227) { int ans = 1; For(i, 1, n - 1) { ans += 1 - use_machine({0, i}); } return ans; } vector<int> v0(1, 0); vector<int> v1; For(i, 1, 2) { if(use_machine({0, i})) v1.eb(i); else v0.eb(i); if(max(sz(v0), sz(v1)) == 2) break; } int ptr = sz(v0) + sz(v1); for(; ptr < n - 1 && ptr < 100;) { pii res; if(sz(v1) > sz(v0)) { res = ask2(v1[0], v1[1], ptr, ptr + 1, true); } else { res = ask2(v0[0], v0[1], ptr, ptr + 1, false); } (res.F ? v1 : v0).eb(ptr); (res.S ? v1 : v0).eb(ptr + 1); ptr += 2; } // for(auto &i:v0) cerr << i << " "; // cerr << "\n"; // for(auto &i:v1) cerr << i << " "; // cerr << "\n"; int ans = sz(v0); int flip = 0; while(ptr < n) { if(sz(v0) < sz(v1)) { v0.swap(v1); flip = 1 - flip; } int r = min(n - ptr, sz(v0)); vector<int> sus; For(i, 1, r) { sus.eb(ptr); ptr++; } auto res = alter(v0, sus, flip); ans += res.F; if(res.S == flip) v0.eb(sus[0]); else v1.eb(sus[0]); } return ans; // std::vector<int> m; // for (int i = 0; i < n; i++) // m.push_back(i); // int c1 = use_machine(m); // m = {0, 1}; // int c2 = use_machine(m); // return c1+c2; } /* 3 0 1 1 4 0 1 0 0 */
#Verdict Execution timeMemoryGrader output
Fetching results...