Submission #1349061

#TimeUsernameProblemLanguageResultExecution timeMemory
1349061avighnaVoltage 2 (JOI26_voltage)C++20
100 / 100
55 ms1052 KiB
#include <bits/stdc++.h>

using namespace std;

int query(vector<int> x, vector<int> y);
void answer(int a, int b);

bool solve(int N, int M) {
  set<int> sink_cands, S;
  for (int i = 0; i < N; ++i) {
    sink_cands.insert(i), S.insert(i);
  }

  int found = 0;
  vector<int> sinks;
  while (!sink_cands.empty()) {
    vector<int> cur_sinks;
    while (!sink_cands.empty()) {
      int u = *sink_cands.begin();
      sink_cands.erase(sink_cands.begin());
      vector<int> x(N), y(N);
      for (int &i : sinks) {
        x[i] = y[i] = 1;
      }
      x[u] = 1;
      if (query(x, y) == 0) {
        cur_sinks.push_back(u);
      }
    }
    if (cur_sinks.empty()) {
      return false;
    }
    for (int &i : cur_sinks) {
      S.erase(i);
    }
    auto recur = [&](auto &&self, vector<int> S, int v) {
      vector<int> x(N), y(N);
      for (int &i : sinks) {
        x[i] = y[i] = 1;
      }
      for (int &i : S) {
        x[i] = y[i] = 1;
      }
      x[v] = 1;
      if (query(x, y) != 1) {
        return;
      }
      if (S.size() == 1) {
        found++;
        answer(S[0], v);
        sink_cands.insert(S[0]);
        return;
      }
      int n = S.size();
      vector<int> S1(S.begin(), S.begin() + n / 2), S2(S.begin() + n / 2, S.end());
      self(self, S1, v);
      self(self, S2, v);
    };
    for (int &v : cur_sinks) {
      recur(recur, vector<int>{S.begin(), S.end()}, v);
    }
    for (int &i : cur_sinks) {
      sinks.push_back(i);
    }
  }

  return found == M;
}
#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...