Submission #836353

#TimeUsernameProblemLanguageResultExecution timeMemory
836353maomao90Counting Mushrooms (IOI20_mushrooms)C++17
80.71 / 100
8 ms496 KiB
// I can do all things through Christ who strengthens me // Philippians 4:13 #include "mushrooms.h" #include <bits/stdc++.h> using namespace std; #define REP(i, j, k) for (int i = j; i < (k); i++) #define RREP(i, j, k) for (int i = j; i >= (k); i--) template <class T> inline bool mnto(T &a, const T b) {return a > b ? a = b, 1 : 0;} template <class T> inline bool mxto(T &a, const T b) {return a < b ? a = b, 1 : 0;} typedef long long ll; typedef long double ld; #define FI first #define SE second typedef pair<int, int> ii; typedef pair<ll, ll> pll; #define ALL(x) x.begin(), x.end() #define SZ(x) (int) x.size() #define pb push_back typedef vector<int> vi; typedef vector<ll> vll; typedef vector<ii> vii; typedef tuple<int, int, int> iii; typedef vector<iii> viii; #ifndef DEBUG #define cerr if (0) cerr #endif const int INF = 1000000005; const ll LINF = 1000000000000000005; const int MAXN = 20005; mt19937 rnd(8); int n; int ans; vi know[2]; int count_mushrooms(int _n) { n = _n; ans = 1; know[0].pb(0); vi id(n); iota(ALL(id), 0); shuffle(1 + ALL(id), rnd); int ptr = 1; while (ptr < n) { int r = use_machine({0, id[ptr]}); know[r].pb(id[ptr]); ans += r == 0; ptr++; if (SZ(know[r]) >= 2) { break; } } while (ptr < n) { bool t = SZ(know[1]) > SZ(know[0]); int kptr = 0; vi x; while (ptr < n && kptr < SZ(know[t])) { x.pb(know[t][kptr++]); x.pb(id[ptr++]); } int r = use_machine(x); int occ = r / 2 + (r % 2); if (t) { ans += occ; } else { ans += SZ(x) / 2 - occ; } know[t ^ (r % 2)].pb(id[ptr - 1]); } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...