atcoder (abc77 C)Snuke Festival のpythonによる解答

問題
atcoder.jp

・前提:この問題は二分探索を使う。

・考え方:Bを1つ決めてそれをB[i]とする。Aの中のB[i]より小さい値の数をbiaとする。Cの中のB[i]より大きい値の数をbicとする。biaとbicを掛け算したものが答えとなりあとはiをforで回せば良い。

・例:A=1,5,B=2,4,C=3,6でB[i]=2のとき、B[i]より小さいAは1、B[i]より大きいCは3,6となり、(1,2,3),(1,2,6)が答え、つまりbia*bic=1*2=2となる。B[i]=4のときも同様。

・実装例

import bisect
N=int(input())
A=list(map(int,input().split()))
B=list(map(int,input().split()))
C=list(map(int,input().split()))
A.sort()
B.sort()
C.sort()

ans=0
for i in range(N):  #真ん中決め打ち 
  bia=bisect.bisect_left(A,B[i])
  bic=N-bisect.bisect_right(C,B[i])
  ans+=bia*bic
print(ans)

・参考:
drken1215.hatenablog.com