atcoder ABC312 C - Invisible Handの勉強

atcoder.jp

・参考:
ABC312 C問題(Invisible Hand)を解く - プロひろ

・説明:二分探索で解く。okとngを二分探索で更新していきokが最終結果になる。(
二分探索アルゴリズムを一般化 〜 めぐる式二分探索法のススメ 〜 - Qiita
を参照)

import bisect
n,m=map(int, input().split())
a=list(map(int, input().split()))
b=list(map(int, input().split()))

a.sort()
b.sort()

ok=10**9+1
ng=0

while abs(ok-ng)!=1:
  mid=(ok+ng)//2
  cnt_sell=bisect.bisect_right(a,mid)  #aが90,110,120のときmid=110だとcnt_sell=2になる。leftだと1になってしまう。
  cnt_buy=m-bisect.bisect_left(b,mid)  #bが80,100,120,1000のときmid=120だとcnt_buy=2になる。rightだと1になってしまう。
  #例えば、cnt_sell>=cnt_buyのときmidの値が大きいので(売りては高く売りたい)ok=midに更新して次のmidを小さくする。
  if cnt_sell>=cnt_buy:
    ok=mid
  else:
    ng=mid
print(ok)