競技プログラミング日記

主に AtCoder の記事です

AtCoder Beginner Contest 299D

ABC299D

0と1の境目を探す問題. \(2^{20} > N \) であるから,1回の質問で区間を\(1/2\)にできれば十分.
制約から,0と1の境目がどこかに存在するので,その場所を探す. 今調べている区間を左右2つに分けて,どちらかには境目が存在する.
実際,区間を\(l\cdots r\)の中間を\(m\)とおくと,

  • \(l,m\)が同じ値なら区間\(m\cdots r\)の中に境目がある.
  • そうでなければ,\(l\cdots m\)の中に境目がある.

使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/12/23/131925"

int main() {
  ll n;
  cin >> n;

  ll l = 0, r = n;
  ll s0;
  cout << "? " << 1 << endl;
  cin >> s0;

  while(abs(r-l) > 1){
    ll md = (l+r)/2;
    cout << "? " <<  md+1 << endl;
    ll x;
    cin >> x;

    if(s0 == x) l = md;
    else r = md;
  }
  cout << "! " << l+1 << endl;
 
  return 0;
}