結果

問題 No.355 数当てゲーム(2)
ユーザー not_522not_522
提出日時 2016-12-15 01:24:53
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 28 ms / 2,000 ms
コード長 6,750 bytes
コンパイル時間 1,802 ms
コンパイル使用メモリ 179,960 KB
実行使用メモリ 24,312 KB
平均クエリ数 5.42
最終ジャッジ日時 2023-09-24 00:45:20
合計ジャッジ時間 5,531 ms
ジャッジサーバーID
(参考情報)
judge11 / judge13
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 28 ms
23,340 KB
testcase_01 AC 25 ms
23,964 KB
testcase_02 AC 25 ms
23,748 KB
testcase_03 AC 24 ms
23,304 KB
testcase_04 AC 24 ms
24,252 KB
testcase_05 AC 24 ms
23,472 KB
testcase_06 AC 25 ms
23,580 KB
testcase_07 AC 24 ms
23,952 KB
testcase_08 AC 24 ms
23,964 KB
testcase_09 AC 25 ms
24,312 KB
testcase_10 AC 25 ms
23,496 KB
testcase_11 AC 24 ms
23,496 KB
testcase_12 AC 23 ms
23,988 KB
testcase_13 AC 24 ms
23,328 KB
testcase_14 AC 26 ms
24,300 KB
testcase_15 AC 25 ms
23,796 KB
testcase_16 AC 26 ms
23,328 KB
testcase_17 AC 24 ms
24,000 KB
testcase_18 AC 25 ms
23,328 KB
testcase_19 AC 26 ms
23,472 KB
testcase_20 AC 24 ms
23,328 KB
testcase_21 AC 23 ms
24,216 KB
testcase_22 AC 24 ms
24,000 KB
testcase_23 AC 25 ms
23,376 KB
testcase_24 AC 23 ms
23,808 KB
testcase_25 AC 23 ms
24,264 KB
testcase_26 AC 25 ms
23,496 KB
testcase_27 AC 23 ms
24,000 KB
testcase_28 AC 25 ms
23,952 KB
testcase_29 AC 24 ms
24,228 KB
testcase_30 AC 23 ms
23,988 KB
testcase_31 AC 24 ms
23,952 KB
testcase_32 AC 25 ms
23,952 KB
testcase_33 AC 25 ms
23,964 KB
testcase_34 AC 25 ms
23,340 KB
testcase_35 AC 23 ms
23,616 KB
testcase_36 AC 25 ms
23,556 KB
testcase_37 AC 25 ms
23,988 KB
testcase_38 AC 25 ms
23,940 KB
testcase_39 AC 26 ms
23,484 KB
testcase_40 AC 26 ms
23,568 KB
testcase_41 AC 25 ms
23,352 KB
testcase_42 AC 25 ms
23,496 KB
testcase_43 AC 24 ms
23,460 KB
testcase_44 AC 22 ms
24,216 KB
testcase_45 AC 26 ms
23,592 KB
testcase_46 AC 24 ms
23,316 KB
testcase_47 AC 26 ms
24,264 KB
testcase_48 AC 26 ms
24,276 KB
testcase_49 AC 25 ms
23,484 KB
testcase_50 AC 24 ms
23,316 KB
testcase_51 AC 23 ms
23,784 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>

using namespace std;

struct Initializer {
  Initializer() {
    cin.tie(0);
    ios::sync_with_stdio(0);
    cout << fixed << setprecision(15);
  }
} initializer;

template<typename T> inline istream& operator>>(istream &s, vector<T> &v) {
  for (T &t : v) s >> t;
  return s;
}

template<typename T> inline ostream& operator<<(ostream &s, const vector<T> &v) {
  for (const T &t : v) s << t << endl;
  return s;
}

template<typename T> inline T min(vector<T>& v) {return *min_element(v.begin(), v.end());}

template<typename T> inline T max(vector<T>& v) {return *max_element(v.begin(), v.end());}

template<typename T> inline int min_element(vector<T>& v) {return min_element(v.begin(), v.end()) - v.begin();}

template<typename T> inline int max_element(vector<T>& v) {return max_element(v.begin(), v.end()) - v.begin();}

template<typename T> inline void sort(vector<T>& v) {sort(v.begin(), v.end());}

template<typename T, typename Function> inline void sort(vector<T>& v, Function func) {sort(v.begin(), v.end(), func);}

template<typename T> inline void rsort(vector<T>& v) {sort(v.rbegin(), v.rend());}

template<typename T> inline void reverse(vector<T>& v) {reverse(v.begin(), v.end());}

template<typename T> inline void unique(vector<T>& v) {v.erase(unique(v.begin(), v.end()), v.end());}

template<typename T> inline void nth_element(vector<T>& v, int n) {nth_element(v.begin(), v.begin() + n, v.end());}

template<typename T> inline bool next_permutation(vector<T>& v) {return next_permutation(v.begin(), v.end());}

template<typename T> inline int find(vector<T>& v, T t) {return find(v.begin(), v.end(), t) - v.begin();}

template<typename T> inline int in(vector<T> v, T t) {return find(v, t) != (int)v.size();}

template<typename T> inline int lower_bound(vector<T>& v, T t) {return lower_bound(v.begin(), v.end(), t) - v.begin();}

template<typename T> inline int upper_bound(vector<T>& v, T t) {return upper_bound(v.begin(), v.end(), t) - v.begin();}

template<typename T> inline T accumulate(const vector<T>& v, function<T(T, T)> func = plus<T>()) {return accumulate(v.begin(), v.end(), T(), func);}

template<typename T> inline void adjacent_difference(vector<T>& v) {adjacent_difference(v.begin(), v.end(), v.begin());}

template<typename T> inline void adjacent_difference(vector<T>& v, vector<T>& u) {adjacent_difference(v.begin(), v.end(), u.begin());}

template<typename T> inline void partial_sum(vector<T>& v, vector<T>& u) {partial_sum(v.begin(), v.end(), u.begin());}

template<typename T> inline T inner_product(vector<T>& v, vector<T>& u) {return inner_product(v.begin(), v.end(), u.begin(), T(0));}

template<typename T> inline int count(const vector<T>& v, T t) {return count(v.begin(), v.end(), t);}

template<typename T, typename Function> inline int count_if(const vector<T>& v, Function func) {return count_if(v.begin(), v.end(), func);}

template<typename T, typename Function> inline void remove_if(vector<T>& v, Function func) {v.erase(remove_if(v.begin(), v.end(), func), v.end());}

template<typename T, typename Function> inline bool any_of(vector<T> v, Function func) {return any_of(v.begin(), v.end(), func);}

template<typename T> inline vector<T> subvector(vector<T>& v, int a, int b) {return vector<T>(v.begin() + a, v.begin() + b);}

template<typename T> inline int kinds(const vector<T>& v) {return set<T>(v.begin(), v.end()).size();}

template<typename T> inline void iota(vector<T>& v) {iota(v.begin(), v.end(), T());}

template<typename T> int least_bit(T n) {
  static_assert(sizeof(T) == 4 || sizeof(T) == 8, "unsupported size");
  if (sizeof(T) == 4) return __builtin_ffs(n) - 1;
  if (sizeof(T) == 8) return __builtin_ffsll(n) - 1;
}

template<typename T> int most_bit(T n) {
  static_assert(sizeof(T) == 4 || sizeof(T) == 8, "unsupported size");
  if (sizeof(T) == 4) return n ? 31 - __builtin_clz(n) : -1;
  if (sizeof(T) == 8) return n ? 63 - __builtin_clzll(n) : -1;
}

template<typename T> int count_bit(T n) {
  static_assert(sizeof(T) == 4 || sizeof(T) == 8, "unsupported size");
  if (sizeof(T) == 4) return __builtin_popcount(n);
  if (sizeof(T) == 8) return __builtin_popcountll(n);
}

class BitIterator : public iterator<input_iterator_tag, int> {
public:

  class Iterator : public iterator<input_iterator_tag, int> {
  private:
    int val, bit;

  public:
    Iterator(int val, int bit) : val(val), bit(bit) {}

    Iterator operator*() {
      return *this;
    }

    bool operator!=(const Iterator& itr) const {
      return val != itr.val;
    }

    void operator++() {
      val = least_bit(bit & (-1 << (val + 1)));
    }

    operator int() {
      return val;
    }
  };
  
  Iterator i, n;
  int bit;

  BitIterator(int n) : i(least_bit(n), n), n(-1, n), bit(n) {}

  bool operator!=(const BitIterator& itr) const {
    return i != itr.i;
  }

  void operator++() {
    *this = BitIterator(bit + 1);
  }

  operator int() const {
    return bit;
  }

  bool in(int i) const {
    return bit & (1 << i);
  }

  Iterator& begin() {
    return i;
  }

  Iterator& end() {
    return n;
  }
};

class FixSizeSet {
private:
  struct Iterator : public iterator<input_iterator_tag, int> {
  private:
    BitIterator val, n;

  public:
    Iterator(int val, int n) : val(val), n(n) {}

    Iterator operator*() {
      return *this;
    }

    bool operator!=(const Iterator& itr) const {
      return n != itr.n;
    }

    void operator++() {
      int x = val & -val, y = val + x;
      val = ((val & ~y) / x / 2) | y;
      if (val >= (1 << n)) n = 0;
    }

    operator int() const {
      return val;
    }

    bool in(int i) const {
      return val.in(i);
    }

    BitIterator::Iterator& begin() {
      return val.begin();
    }

    BitIterator::Iterator& end() {
      return val.end();
    }
  };
  
  Iterator i, n;

public:
  FixSizeSet(int n, int k) : i((1 << k) - 1, n), n(0, 0) {}

  Iterator& begin() {
    return i;
  }

  Iterator& end() {
    return n;
  }
};

pair<int, int> query(const vector<int>& n) {
  cout << n[0] << " " << n[1] << " " << n[2] << " " << n[3] << endl;
  int x, y;
  cin >> x >> y;
  return make_pair(x, y);
}

int main() {
  map<vector<int>, pair<int, int>> mem;
  for (auto i : FixSizeSet(10, 4)) {
    vector<int> v;
    for (auto j : i) v.emplace_back(j);
    do {
      bool ok = true;
      for (const auto& q : mem) {
        int x = 0, y = 0;
        for (int k = 0; k < 4; ++k) {
          if (q.first[k] == v[k]) ++x;
          else if (in(v, q.first[k])) ++y;
        }
        if (x != q.second.first || y != q.second.second) ok = false;
      }
      if (!ok) continue;
      auto q = query(v);
      if (q.first == 4) return 0;
      mem[v] = q;
    } while (next_permutation(v));
  }
}
0