Submission #1206599

#TimeUsernameProblemLanguageResultExecution timeMemory
1206599avighnaCOVID tests (CEOI24_covid)C++20
61.62 / 100
542 ms436 KiB
#include <bits/stdc++.h>

int main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);

  int n, t;
  double p;
  std::cin >> n >> p >> t;

  std::mt19937 gen(std::random_device{}());
  auto probabilistic_method = [&]() {
    std::vector<int> a(n);
    std::iota(a.begin(), a.end(), 0);
    std::shuffle(a.begin(), a.end(), gen);
    std::string ans(n, '0');
    std::vector<int> idx;
    auto solve_dnc = [&](auto &&self, int l, int r, bool left_zero) {
      if (l == r and left_zero) {
        ans[idx[l]] = '1';
        return true;
      }
      char c;
      if (left_zero) {
        c = 'P';
      } else {
        std::string q(n, '0');
        for (int i = l; i <= r; ++i) {
          q[idx[i]] = '1';
        }
        std::cout << "Q " << q << std::endl;
        std::cin >> c;
      }
      if (c == 'N') {
        return false;
      }
      if (l == r) {
        ans[idx[l]] = '0' + (c == 'P');
        return c == 'P';
      }
      int m = (l + r) / 2;
      bool b = self(self, l, m, false);
      self(self, m + 1, r, !b);
      return true;
    };
    int group_size = std::round(std::log(0.5) / std::log(1 - p));
    while (!a.empty()) {
      for (int i = 0; i < group_size and !a.empty(); ++i) {
        idx.push_back(a.back());
        a.pop_back();
      }
      solve_dnc(solve_dnc, 0, idx.size() - 1, false);
      idx.clear();
    }
    std::cout << "A " << ans << std::endl;
  };

  auto brute_force_method = [&]() {
    std::string ans(n, '0');
    for (int i = 0; i < n; ++i) {
      std::string q(n, '0');
      q[i] = '1';
      std::cout << "Q " << q << std::endl;
      char c;
      std::cin >> c;
      ans[i] = '0' + (c == 'P');
    }
    std::cout << "A " << ans << std::endl;
  };

  auto binary_search_method = [&]() {
    std::string ans(n, '0');
    for (int i = 0; i < n; ++i) {
      auto idx = *std::ranges::partition_point(std::views::iota(i, n), [&](int j) {
        std::string q(n, '0');
        for (int idx = i; idx <= j; ++idx) {
          q[idx] = '1';
        }
        std::cout << "Q " << q << std::endl;
        char c;
        std::cin >> c;
        return c == 'N';
      });
      if (idx < n) {
        ans[idx] = '1';
      }
      i = idx;
    }
    std::cout << "A " << ans << std::endl;
  };

  while (t--) {
    if (p < 0.001 or p > 0.2) {
      brute_force_method();
    } else if (p > 0.005 and p < 0.02) {
      binary_search_method();
    } else {
      probabilistic_method();
    }
    char c;
    std::cin >> c;
  }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...