제출 #1351911

#제출 시각아이디문제언어결과실행 시간메모리
1351911avighnaSuper Dango Maker (JOI22_dango3)C++20
100 / 100
141 ms928 KiB
#include <bits/stdc++.h>

using namespace std;

int Query(const vector<int> &x);
void Answer(const vector<int> &a);

void Solve(int N, int M) {
  const int thres = 420;
  auto extract = [&](vector<int> &a) {
    auto ac = a;
    set<int> b;
    auto query = [&]() {
      vector<int> qv(b.begin(), b.end());
      for (int &i : a) {
        qv.push_back(i);
      }
      return Query(qv);
    };
    if (!query()) {
      return false;
    }
    while (!a.empty()) {
      int e = a.back();
      a.pop_back();
      if (query() == 0) {
        b.insert(e);
      }
    }
    Answer(vector<int>(b.begin(), b.end()));
    for (int i = 0; i < ac.size(); ++i) {
      if (!b.contains(ac[i])) {
        a.push_back(ac[i]);
      }
    }
    return true;
  };
  mt19937 gen(random_device{}());
  auto recur = [&](auto &&self, vector<int> a) {
    if (a.size() < thres) {
      while (extract(a)) {}
      return a;
    }
    const double mul = 0.8;
    for (int _ = 0; _ < 100; ++_) {
      shuffle(a.begin(), a.end(), gen);
      vector<int> b(a.size() * mul);
      copy(a.begin(), a.begin() + a.size() * mul, b.begin());
      if (Query(b) != 0) {
        b = self(self, b);
      }
      vector<int> aa;
      for (int i = a.size() * mul; i < a.size(); ++i) {
        aa.push_back(a[i]);
      }
      for (int &i : b) {
        aa.push_back(i);
      }
      a = aa;
    }
    while (extract(a)) {}
    return a;
  };
  vector<int> a(N * M);
  iota(a.begin(), a.end(), 1);
  shuffle(a.begin(), a.end(), gen);
  recur(recur, a);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...