Submission #1054746

#TimeUsernameProblemLanguageResultExecution timeMemory
1054746Gromp15Counting Mushrooms (IOI20_mushrooms)C++17
56.22 / 100
6 ms852 KiB
#include <bits/stdc++.h> #include "mushrooms.h" #define sz(x) (int)x.size() using namespace std; const int len = 115; int count_mushrooms(int n) { vector<int> A{0}, B; vector<int> idx(n-1); iota(idx.begin(), idx.end(), 1); shuffle(idx.begin(), idx.end(), mt19937(2134321)); idx.insert(idx.begin(), -1); for (int i = 1; i < min(n, len * 2); i++) { if (i+1 < min(n, len * 2)) { int res = use_machine({idx[i], 0, idx[i+1]}); if (res == 0) { A.push_back(idx[i]); A.push_back(idx[i+1]); } else if (res == 2) { B.push_back(idx[i]); B.push_back(idx[i+1]); } else { int res = use_machine({0, idx[i]}); if (res == 0) A.push_back(idx[i]), B.push_back(idx[i+1]); else A.push_back(idx[i+1]), B.push_back(idx[i]); } i++; } else { (use_machine({0, idx[i]}) ? B : A).push_back(idx[i]); } } int ans = A.size(); bool inv = 0; if (A.size() < B.size()) swap(A, B), inv = 1; /* for (int x : A) cout << x << " "; cout << '\n'; for (int x : B) cout << x << " "; cout << '\n'; */ vector<int> cur{A[0]}; for (int j = len * 2, on = 1; j < n; j++) { if (on == sz(A)) { int res = use_machine(cur); ans += inv ? res / 2 : sz(cur) - sz(A) - res / 2; cur.clear(); cur.emplace_back(A[0]); on = 1; } cur.emplace_back(idx[j]); cur.emplace_back(A[on++]); } //cout << "LST " << cur.size()<< '\n'; if (cur.size() > 1) { int res = use_machine(cur); //cout << "R " << res << " " << ans << '\n'; ans += inv ? res / 2 : sz(cur) / 2 - res / 2; } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...