제출 #805130

#제출 시각아이디문제언어결과실행 시간메모리
805130PixelCat버섯 세기 (IOI20_mushrooms)C++14
72.67 / 100
8 ms464 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; } 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); for(int i = 1; i < 220; i += 3) { For(_, 1, 3) sussy.pop_back(); int r1 = use_machine({0, i, i + 1, i + 2}); if(r1 % 2) { v1.eb(i + 2); if(r1 == 3) { v1.eb(i); v0.eb(i + 1); } else { int r2 = use_machine({i, i + 1, 0}); (r2 == 1 ? v1 : v0).eb(i); (r2 == 0 ? v0 : v1).eb(i + 1); } } else { v0.eb(i + 2); if(r1 == 0) { v0.eb(i); v0.eb(i + 1); } else { oao.eb(i, i + 1); } } } 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...