제출 #1195501

#제출 시각아이디문제언어결과실행 시간메모리
1195501avighnaMinerals (JOI19_minerals)C++20
100 / 100
16 ms2136 KiB
#include <algorithm> #include <random> #include <vector> int Query(int x); void Answer(int x, int y); void Solve(int n) { int pr = Query(1); std::vector<int> set1 = {1}, set2; for (int i = 2; i <= 2 * n; ++i) { int ne = Query(i); (pr == ne ? set2 : set1).push_back(i); pr = ne; } std::random_device rd; std::mt19937 rng(rd()); std::shuffle(set2.begin(), set2.end(), rng); auto solve = [&](auto &&self, int l, int r, bool added) { if (l == r) { Answer(set1[l], set2[l]); return; } int m = l + (r - l) * 0.38; for (int i = l; i <= m; ++i) { pr = Query(set1[i]); } int trues = 0, falses = 0; std::partition(set2.begin() + l, set2.begin() + r + 1, [&](int x) { if (falses >= r - m) { return true; } if (trues >= m - l + 1) { return false; } int ne = Query(x); bool cond = (pr == ne) ^ added; pr = ne; trues += cond, falses += !cond; return cond; }); self(self, l, m, !added); self(self, m + 1, r, added); }; solve(solve, 0, n - 1, true); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...