Submission #1195501

#TimeUsernameProblemLanguageResultExecution timeMemory
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...