アルゴリズム

答えで二分探索

判定問題への変換

候補値 xx に対する判定 ok(x) が単調なら、真偽の境界を二分探索できる。「最大値を最小化」「最小値を最大化」という形で頻出する。

long long ng = -1;
long long ok = 1LL << 60;
while (abs(ok - ng) > 1) {
    long long mid = ng + (ok - ng) / 2;
    (check(mid) ? ok : ng) = mid;
}

設計の確認

  1. ok(x) の意味を一文で書く
  2. 単調性を証明する
  3. 初期値が必ず NG / OK であると確認する
  4. 整数か実数かに応じて終了条件を決める