ARC 094 D - Worst Case [Python]

問題はこちら

A <= B として一般性を失わない。解説はO(1)解法っぽいんだけどO(log A_max)解法しか思いつかなかった。あとsqrtを使うと誤差に悩まされがちなので二分探索でやった。

import sys
readline = sys.stdin.readline


def main():
 Q = int(readline())

 for _ in range(Q):
   A, B = map(int, readline().split())
 
   if A == B:
     print(2 * A - 2)
     continue

   if A > B:
     A, B = B, A
   ans = A - 1

   ok, ng = 1, B
   while ng - ok > 1:
     mid = (ok + ng) // 2
     if mid ** 2 <= A * B - 1:
       ok = mid
     else:
       ng = mid
   if (A * B - 1) // ok > A:
     ans += ok
     ans += (A * B - 1) // (ok + 1) - A
   else:
     while ok > 0 and (A * B - 1) // ok <= A:
       ok -= 1
     ans += ok

   print(ans)


if __name__ == "__main__":
 main()

この記事が気に入ったらサポートをしてみませんか?