Submission #805162

#TimeUsernameProblemLanguageResultExecution timeMemory
805162PixelCatCounting Mushrooms (IOI20_mushrooms)C++14
72.90 / 100
11 ms512 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>; int SQ = 101; int alter(vector<int> jury, vector<int> sus, bool flip) { assert(sz(jury) > sz(sus)); vector<int> q; int n = sz(sus); q.eb(jury.back()); jury.pop_back(); while(sz(sus)) { q.eb(sus.back()); sus.pop_back(); q.eb(jury.back()); jury.pop_back(); } int res = use_machine(q) / 2; if(flip) return res; return n - res; } bool check(int s0, int s1, int ss) { if(max(s0, s1) < 10) return true; int mxs; // dont ask? mxs = max(s0, s1) - 1; int cost0 = (ss + mxs - 1) / mxs; // ask? mxs = min(max(s0 + 1, s1 + 2), max(s0 + 2, s1 + 1)); int cost1 = (ss - 3 + mxs - 1) / mxs + 2; return cost1 < cost0; } 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; vector<pii> oao; vector<int> sussy; Forr(i, n - 1, 1) sussy.eb(i); random_shuffle(all(sussy)); while(check(sz(v0), sz(v1), sz(sussy))) { int a, b, c; a = sussy.back(); sussy.pop_back(); b = sussy.back(); sussy.pop_back(); c = sussy.back(); sussy.pop_back(); int r1 = use_machine({0, a, b, c}); if(r1 % 2) { v1.eb(c); if(r1 == 3) { v1.eb(a); v0.eb(b); } else { int r2 = use_machine({a, b, 0}); (r2 == 1 ? v1 : v0).eb(a); (r2 == 0 ? v0 : v1).eb(b); } } else { v0.eb(c); if(r1 == 0) { v0.eb(a); v0.eb(b); } else { oao.eb(a, b); } } } if(!sz(v1)) { for(auto &i:oao) { sussy.eb(i.F); sussy.eb(i.S); } } else { int p = v1.back(); for(auto &i:oao) { int r = use_machine({i.F, i.S, p}); (r == 1 ? v0 : v1).eb(i.F); (r == 2 ? v0 : v1).eb(i.S); } } // for(auto &i:v0) cerr << i << " "; // cerr << "\n"; // for(auto &i:v1) cerr << i << " "; // cerr << "\n"; int ans = sz(v0); int flip = 0; if(sz(v0) < sz(v1)) { v0.swap(v1); flip = 1; } while(sz(sussy)) { int r = min(sz(sussy), sz(v0) - 1); vector<int> sus; For(i, 1, r) { sus.eb(sussy.back()); sussy.pop_back(); } ans += alter(v0, sus, flip); } 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...