結果
問題 |
No.3246 80% Accuracy Calculator
|
ユーザー |
|
提出日時 | 2025-08-22 23:15:10 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 89 ms / 2,000 ms |
コード長 | 2,466 bytes |
コンパイル時間 | 1,905 ms |
コンパイル使用メモリ | 203,100 KB |
実行使用メモリ | 26,356 KB |
平均クエリ数 | 951.40 |
最終ジャッジ日時 | 2025-08-22 23:15:37 |
合計ジャッジ時間 | 6,788 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 43 |
ソースコード
#include <bits/stdc++.h> using namespace std; int main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); int S,T,U = 0; //cin >> S >> T; int query = 0; auto ask = [&](char c) -> int { if(false){ if(c == 'A') return S; if(c == 'B') return T; if(c == 'C') return U; } map<int,int> M; for(int i=0; i<50; i++){ assert(query < 8888); query++; cout << "? " << c << endl; int v; cin >> v; M[v]++; } int ret = 0,ap = -1; for(auto [k,v] : M) if(ap < v) ap = v,ret = k; return ret; }; auto add = [&](char A,char B,char C) -> void { if(false){ int ret = 0; if(A == 'A') ret += S,assert(S); if(A == 'B') ret += T,assert(T); if(A == 'C') ret += U,assert(U); if(B == 'A') ret += S,assert(S); if(B == 'B') ret += T,assert(T); if(B == 'C') ret += U,assert(U); if(C == 'A') S = ret; if(C == 'B') T = ret; if(C == 'C') U = ret; return; } assert(query < 8888); query++; cout << "+ " << A << " " << B << " " << C << endl; int ret; cin >> ret; if(ret == 0) return; assert(false); }; char A = 'A',B = 'B',C = 'C'; int x = ask('A'),y = ask('B'),c = 0; { while(true){ add(A,A,C); if(ask(C) == x+x) break; } swap(B,C); } bool first = true; for(int d=0; d<10; d++){ if((y>>d)&1){ if(first){ swap(A,C),swap(A,B); c += (1<<d)*x; first = false; continue; } else{ int goal = c+(1<<d)*x; while(true){ add(A,C,B); if(ask(B) == goal) break; } c = goal; swap(B,C); } } if(first){ int goal = x<<(d+2); while(true){ add(B,B,A); if(ask(A) == goal) break; } swap(A,B); } else{ int goal = x<<(d+1); while(true){ add(A,A,B); if(ask(B) == goal) break; } swap(A,B); } } cout << "! " << C << endl; }