結果

問題 No.355 数当てゲーム(2)
ユーザー not_522
提出日時 2016-12-15 01:24:53
言語 C++14
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 31 ms / 2,000 ms
コード長 6,750 bytes
コンパイル時間 2,000 ms
コンパイル使用メモリ 182,584 KB
実行使用メモリ 25,464 KB
平均クエリ数 5.42
最終ジャッジ日時 2024-07-17 00:40:19
合計ジャッジ時間 6,500 ms
ジャッジサーバーID
(参考情報)
judge5 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 52
権限があれば一括ダウンロードができます

ソースコード

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));
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0