제출 #959368

#제출 시각아이디문제언어결과실행 시간메모리
959368The_Samurai버섯 세기 (IOI20_mushrooms)C++17
0 / 100
0 ms344 KiB
#include "mushrooms.h" #include "bits/stdc++.h" using namespace std; int count_mushrooms(int n) { vector<int> zeros = {0}; const int cnt = 45, b = 635; for (int l = 1, r = b; l < n and zeros.size() < cnt; l += b, r += b) { r = min(r, n - 1); vector<int> v = {0}; for (int i = l; i <= r; i++) v.emplace_back(i); int x = use_machine(v); if (x == 0) { for (int i = l; i <= r; i++) zeros.emplace_back(i); continue; } if (x == 1) { for (int i = l; i <= r; i++) { if (use_machine({0, i})) break; zeros.emplace_back(i); } continue; } while (true) { int lx = max(l, zeros.back() + 1), rx = r, best = -1; int last = l; while (lx <= rx) { int mid = (lx + rx) >> 1; v = {0}; for (int i = last; i <= mid; i++) v.emplace_back(i); if (use_machine(v) >= 2) { rx = mid - 1; best = mid; } else { last = mid; lx = mid + 1; } } if (best == -1) break; zeros.emplace_back(best); } } if (zeros.size() < cnt) return zeros.size(); vector<int> unused; for (int i = zeros.back() + 1; i < n; i++) unused.emplace_back(i); int ans = zeros.size(); while (!unused.empty()) { int ln = min(unused.size(), zeros.size()); vector<int> v; for (int i = 0; i < ln; i++) { v.emplace_back(zeros[i]); v.emplace_back(unused.back()); unused.pop_back(); } ans += ln - (use_machine(v) + 1) / 2; } return ans; } // 0 -> 3 // 2 -
#Verdict Execution timeMemoryGrader output
Fetching results...