제출 #366063

#제출 시각아이디문제언어결과실행 시간메모리
366063KoD동굴 (IOI13_cave)C++17
100 / 100
679 ms1004 KiB
#include "cave.h"
#include <set>
#include <vector>

int S[5000];
int D[5000];

template <class T>
using Vec = std::vector<T>;

void exploreCave(int N) {
  const auto query = [&] {
    const auto ret = tryCombination(S);
    return ret == -1 ? N : ret;
  };
  std::set<int> remain;
  for (int i = 0; i < N; ++i) {
    remain.insert(i);
  }
  for (int d = 0; d < N; ++d) {
    // Which switch is connected to the door 'd' ?
    for (const auto x: remain) {
      S[x] = 0;
    }
    const auto allZero = query();
    Vec<int> cur(remain.begin(), remain.end());
    while (cur.size() > 1) {
      Vec<int> next;
      next.reserve((cur.size() + 1) / 2);
      while (cur.size() > next.size()) {
        next.push_back(cur.back());
        cur.pop_back();
      }
      for (const auto x: cur) {
        S[x] = 1;
      }
      const auto tmp = query();
      for (const auto x: cur) {
        S[x] = 0;
      }
      if ((allZero == d) == (tmp == d)) {
        cur = std::move(next);
      }
    }
    const auto i = cur.front();
    remain.erase(i);
    D[i] = d;
    S[i] = (allZero == d ? 1 : 0);
  }
  answer(S, D);
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…