結果
問題 |
No.3246 80% Accuracy Calculator
|
ユーザー |
![]() |
提出日時 | 2025-08-23 02:00:59 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 73 ms / 2,000 ms |
コード長 | 11,513 bytes |
コンパイル時間 | 3,549 ms |
コンパイル使用メモリ | 286,696 KB |
実行使用メモリ | 26,356 KB |
平均クエリ数 | 1108.30 |
最終ジャッジ日時 | 2025-08-23 02:01:08 |
合計ジャッジ時間 | 8,658 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 43 |
ソースコード
#include <bits/stdc++.h> #include <cassert> using namespace std; using ll = long long int; using u64 = unsigned long long; using pll = pair<ll, ll>; // #include <atcoder/all> // using namespace atcoder; #define REP(i, a, b) for (ll i = (a); i < (b); i++) #define REPrev(i, a, b) for (ll i = (a); i >= (b); i--) #define ALL(coll) (coll).begin(), (coll).end() #define SIZE(v) ((ll)((v).size())) #define REPOUT(i, a, b, exp, sep) REP(i, (a), (b)) cout << (exp) << (i + 1 == (b) ? "" : (sep)); cout << "\n" // @@ !! LIM(debug) // ---- inserted function f:<< from util.cc // declarations template <typename T1, typename T2> ostream& operator<< (ostream& os, const pair<T1,T2>& p); template <typename T1, typename T2, typename T3> ostream& operator<< (ostream& os, const tuple<T1,T2,T3>& t); template <typename T1, typename T2, typename T3, typename T4> ostream& operator<< (ostream& os, const tuple<T1,T2,T3,T4>& t); template <typename T1, typename T2, typename T3, typename T4, typename T5> ostream& operator<< (ostream& os, const tuple<T1,T2,T3,T4,T5>& t); template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6> ostream& operator<< (ostream& os, const tuple<T1,T2,T3,T4,T5,T6>& t); template <typename T> ostream& operator<< (ostream& os, const vector<T>& v); template <typename T, typename C> ostream& operator<< (ostream& os, const set<T, C>& v); template <typename T, typename C> ostream& operator<< (ostream& os, const unordered_set<T, C>& v); template <typename T, typename C> ostream& operator<< (ostream& os, const multiset<T, C>& v); template <typename T1, typename T2, typename C> ostream& operator<< (ostream& os, const map<T1, T2, C>& mp); template <typename T1, typename T2, typename C> ostream& operator<< (ostream& os, const unordered_map<T1, T2, C>& mp); template <typename T, typename T2> ostream& operator<< (ostream& os, const queue<T, T2>& orig); template <typename T, typename T2> ostream& operator<< (ostream& os, const deque<T, T2>& orig); template <typename T, typename T2, typename T3> ostream& operator<< (ostream& os, const priority_queue<T, T2, T3>& orig); template <typename T> ostream& operator<< (ostream& os, const stack<T>& st); #if __cplusplus >= 201703L template <typename T> ostream& operator<< (ostream& os, const optional<T>& t); #endif ostream& operator<< (ostream& os, int8_t x); ostream& operator<< (ostream& os, const __int128& x); // definitions template <typename T1, typename T2> ostream& operator<< (ostream& os, const pair<T1,T2>& p) { os << "(" << p.first << ", " << p.second << ")"; return os; } template <typename T1, typename T2, typename T3> ostream& operator<< (ostream& os, const tuple<T1,T2,T3>& t) { os << "(" << get<0>(t) << ", " << get<1>(t) << ", " << get<2>(t) << ")"; return os; } template <typename T1, typename T2, typename T3, typename T4> ostream& operator<< (ostream& os, const tuple<T1,T2,T3,T4>& t) { os << "(" << get<0>(t) << ", " << get<1>(t) << ", " << get<2>(t) << ", " << get<3>(t) << ")"; return os; } template <typename T1, typename T2, typename T3, typename T4, typename T5> ostream& operator<< (ostream& os, const tuple<T1,T2,T3,T4,T5>& t) { os << "(" << get<0>(t) << ", " << get<1>(t) << ", " << get<2>(t) << ", " << get<3>(t) << ", " << get<4>(t) << ")"; return os; } template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6> ostream& operator<< (ostream& os, const tuple<T1,T2,T3,T4,T5,T6>& t) { os << "(" << get<0>(t) << ", " << get<1>(t) << ", " << get<2>(t) << ", " << get<3>(t) << ", " << get<4>(t) << ", " << get<5>(t) << ")"; return os; } template <typename T> ostream& operator<< (ostream& os, const vector<T>& v) { os << '['; for (auto it = v.begin(); it != v.end(); it++) { if (it != v.begin()) os << ", "; os << *it; } os << ']'; return os; } template <typename T, typename C> ostream& operator<< (ostream& os, const set<T, C>& v) { os << '{'; for (auto it = v.begin(); it != v.end(); it++) { if (it != v.begin()) os << ", "; os << *it; } os << '}'; return os; } template <typename T, typename C> ostream& operator<< (ostream& os, const unordered_set<T, C>& v) { os << '{'; for (auto it = v.begin(); it != v.end(); it++) { if (it != v.begin()) os << ", "; os << *it; } os << '}'; return os; } template <typename T, typename C> ostream& operator<< (ostream& os, const multiset<T, C>& v) { os << '{'; for (auto it = v.begin(); it != v.end(); it++) { if (it != v.begin()) os << ", "; os << *it; } os << '}'; return os; } template <typename T1, typename T2, typename C> ostream& operator<< (ostream& os, const map<T1, T2, C>& mp) { os << '['; for (auto it = mp.begin(); it != mp.end(); it++) { if (it != mp.begin()) os << ", "; os << it->first << ": " << it->second; } os << ']'; return os; } template <typename T1, typename T2, typename C> ostream& operator<< (ostream& os, const unordered_map<T1, T2, C>& mp) { os << '['; for (auto it = mp.begin(); it != mp.end(); it++) { if (it != mp.begin()) os << ", "; os << it->first << ": " << it->second; } os << ']'; return os; } template <typename T, typename T2> ostream& operator<< (ostream& os, const queue<T, T2>& orig) { queue<T, T2> que(orig); bool first = true; os << '['; while (!que.empty()) { T x = que.front(); que.pop(); if (!first) os << ", "; os << x; first = false; } return os << ']'; } template <typename T, typename T2> ostream& operator<< (ostream& os, const deque<T, T2>& orig) { deque<T, T2> que(orig); bool first = true; os << '['; while (!que.empty()) { T x = que.front(); que.pop_front(); if (!first) os << ", "; os << x; first = false; } return os << ']'; } template <typename T, typename T2, typename T3> ostream& operator<< (ostream& os, const priority_queue<T, T2, T3>& orig) { priority_queue<T, T2, T3> pq(orig); bool first = true; os << '['; while (!pq.empty()) { T x = pq.top(); pq.pop(); if (!first) os << ", "; os << x; first = false; } return os << ']'; } template <typename T> ostream& operator<< (ostream& os, const stack<T>& st) { stack<T> tmp(st); os << '['; bool first = true; while (!tmp.empty()) { T& t = tmp.top(); if (first) first = false; else os << ", "; os << t; tmp.pop(); } os << ']'; return os; } #if __cplusplus >= 201703L template <typename T> ostream& operator<< (ostream& os, const optional<T>& t) { if (t.has_value()) os << "v(" << t.value() << ")"; else os << "nullopt"; return os; } #endif ostream& operator<< (ostream& os, int8_t x) { os << (int32_t)x; return os; } // for Enum type; just displays ordinals. template <typename E> typename std::enable_if<std::is_enum<E>::value, std::ostream&>::type operator<<(std::ostream& os, E e) { return os << static_cast<typename std::underlying_type<E>::type>(e); } // This is a very ad-hoc implementation... ostream& operator<<(ostream& os, const __int128& v) { unsigned __int128 a = v < 0 ? -v : v; ll i = 0; string s(64, ' '); if (v == 0) { s[i++] = '0'; }else { while (a > 0) { s[i++] = '0' + (char)(a % 10); a /= 10; } } if (v < 0) { s[i++] = '-'; } s.erase(s.begin() + i, s.end()); reverse(s.begin(), s.end()); os << s; return os; } // ---- end f:<< // ---- inserted library file debug.cc template <class... Args> string dbgFormat(const char* fmt, Args... args) { size_t len = snprintf(nullptr, 0, fmt, args...); char buf[len + 1]; snprintf(buf, len + 1, fmt, args...); return string(buf); } template <class Head> void dbgLog(bool with_nl, Head&& head) { cerr << head; if (with_nl) cerr << endl; } template <class Head, class... Tail> void dbgLog(bool with_nl, Head&& head, Tail&&... tail) { cerr << head << " "; dbgLog(with_nl, forward<Tail>(tail)...); } #if DEBUG #define DLOG(...) dbgLog(true, __VA_ARGS__) #define DLOGNNL(...) dbgLog(false, __VA_ARGS__) #define DFMT(...) cerr << dbgFormat(__VA_ARGS__) << endl #define DCALL(func, ...) func(__VA_ARGS__) #else #define DLOG(...) #define DLOGNNL(...) #define DFMT(...) #define DCALL(func, ...) #endif /* #if DEBUG_LIB #define DLOG_LIB(...) dbgLog(true, __VA_ARGS__) #define DLOGNNL_LIB(...) dbgLog(false, __VA_ARGS__) #define DFMT_LIB(...) cerr << dbgFormat(__VA_ARGS__) << endl #define DCALL_LIB(func, ...) func(__VA_ARGS__) #else #define DLOG_LIB(...) #define DFMT_LIB(...) #define DCALL_LIB(func, ...) #endif */ #define DUP1(E1) #E1 "=", E1 #define DUP2(E1,E2) DUP1(E1), DUP1(E2) #define DUP3(E1,...) DUP1(E1), DUP2(__VA_ARGS__) #define DUP4(E1,...) DUP1(E1), DUP3(__VA_ARGS__) #define DUP5(E1,...) DUP1(E1), DUP4(__VA_ARGS__) #define DUP6(E1,...) DUP1(E1), DUP5(__VA_ARGS__) #define DUP7(E1,...) DUP1(E1), DUP6(__VA_ARGS__) #define DUP8(E1,...) DUP1(E1), DUP7(__VA_ARGS__) #define DUP9(E1,...) DUP1(E1), DUP8(__VA_ARGS__) #define DUP10(E1,...) DUP1(E1), DUP9(__VA_ARGS__) #define DUP11(E1,...) DUP1(E1), DUP10(__VA_ARGS__) #define DUP12(E1,...) DUP1(E1), DUP11(__VA_ARGS__) #define GET_MACRO(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,NAME,...) NAME #define DUP(...) GET_MACRO(__VA_ARGS__, DUP12, DUP11, DUP10, DUP9, DUP8, DUP7, DUP6, DUP5, DUP4, DUP3, DUP2, DUP1)(__VA_ARGS__) #define DLOGK(...) DLOG(DUP(__VA_ARGS__)) #define DLOGKL(lab, ...) DLOG(lab, DUP(__VA_ARGS__)) #if DEBUG_LIB #define DLOG_LIB DLOG #define DLOGK_LIB DLOGK #define DLOGKL_LIB DLOGKL #endif // ---- end debug.cc // @@ !! LIM -- end mark -- int main(/* int argc, char *argv[] */) { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout << setprecision(20); #if DEBUG ll rep = 1; #else ll rep = 59; #endif auto varname = [&](ll var) -> char { if (var == 0) return 'A'; else if (var == 1) return 'B'; else if (var == 2) return 'C'; else assert(0); }; auto other = [&](ll a, ll b) -> ll { if (a != 0 and b != 0) return 0; else if (a != 1 and b != 1) return 1; else if (a != 2 and b != 2) return 2; else assert(false); }; auto ask_val = [&](ll var) -> ll { cout << "? " << varname(var) << endl; ll v; cin >> v; return v; }; auto ask_add = [&](ll var1, ll var2, ll var3) -> void { cout << "+ " << varname(var1) << " " << varname(var2) << " " << varname(var3) << endl; ll v; cin >> v; assert(v == 0); }; auto get_val = [&](ll var) -> ll { unordered_map<ll, ll> mp; REP(i, 0, rep) { ll v = ask_val(var); mp[v]++; } for (auto [v, num] : mp) if (2 * num > rep) return v; assert(false); }; auto add = [&](ll var1, ll var2, ll var3, ll exp) -> void { DLOGKL("add", var1, var2, var3, exp); while (true) { ask_add(var1, var2, var3); ll v = get_val(var3); if (v == exp) return; } }; auto report = [&](ll var) -> void { char c = varname(var); cout << "! " << c << endl; }; ll x = get_val(0); ll y = get_val(1); ll var_x = 0; ll var_s = 2; ll s = 0; REP(i, 0, bit_width((u64)y)) { if (y >> i & 1) { ll var_tmp_a = other(var_s, var_x); s = s + x; add(var_s, var_x, var_tmp_a, s); var_s = var_tmp_a; } ll var_tmp_b = other(var_s, var_x); x *= 2; add(var_x, var_x, var_tmp_b, x); var_x = var_tmp_b; } report(var_s); return 0; }