image 二分探索の四つの構成要素をチェックする

  • 1: f(x)は正しいか?
    • ここが間違ってるとどうしようもない
    • 何パターンか書き出してみて確認するべき
  • 2: 大小比較は等号を含むか?
    • 一致する値がない時に左右どちらを選ぶかによって変わる
    • image
    • 一致する場合にはそれ、しない場合には左を選ぶならf(x)=Tとf(x)<Tがleftになるように探索した上でleftを返す必要がある
    • abc174Eでは逆に右を返す必要があった
    • 1と2が分けられないタイプの問題もある
      • その場合は1がboolを返す実装になる
  • 3: leftの初期値は適切か?
    • 初期値がleftの満たすべき不等号を満たしているか2を踏まえて確認
  • 4: rightの初期値は適切か?

python

def solve(N, K, AS):
    left = 0  # (3)
    right = max(AS)  # (4)

    while left < right - 1:
        x = (left + right) // 2
        y = f(x)  # (1)
        if y > K:  # (2)
            left = x
        else:
            right = x
    return right