見出し画像

Atcoder典型90問 007(★3)[二分探索]

■要約

 問題文通り考えるとQ人の生徒について,N個のクラスを考えないといけないのでO(NQ) = 10^10でだめなことが分かる.そこで今自分が使えるアルゴリズムを考えると,bit全探索/二分探索/累積和ぐらいであり,これらが使えないか考えた.すると,今回の問題は,全部の差を考えるんじゃなくて,生徒Bのレーティングが,クラスのレーティング配列Aのどの値に近ければわかればいいので,配列Aをソートして,何番目にbのレーティングが含まれればいいか分かれば,その左右の絶対知を計算するだけという前回のABCのC問題と全く同じ解き方であることが分かった.典型90問の強さ典型たる所以を感じた瞬間であった.

N = int(input())
A = list(map(int, input().split()))
Q = int(input())
B = []
for _ in range(Q):
 B.append(int(input()))
 
A.sort() #①ソート
import bisect
for b in B:
 ans = 10**10+1
 i = bisect.bisect_left(A, b) #②配列Aのどこの位置に挿入されるか
 #③左と右の値との不満度を計算
 if 0 <= i - 1 < N:
   a1 = A[i-1] #左側
   ans = min(ans, abs(b - a1))
 if 0 <= i < N:
   a2 = A[i] #右側
   ans = min(ans, abs(b - a2))
   
 print(ans)

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