このシリーズではレッドコーダーが教える、競プロ・AtCoder上達のガイドライン【中級編:目指せ水色コーダー!】でまとめられている100問をPythonで解いています。
問題
AtCoder Beginner Contest 077 C - Snuke Festival
ポイント
祭壇中部を中心に考えていきます。
祭壇中部で使用するパーツの大きさをYとすると、作成できる祭壇の種類は、
(祭壇上部に用意されているYより小さいパーツの数) x (祭壇下部に用意されているYより大きいパーツの数)
となります。
祭壇中部に用意されているパーツそれぞれについて、作成できる祭壇の種類を求めていきます。
(祭壇上部に用意されているYより小さいパーツの数) と、(祭壇下部に用意されているYより大きいパーツの数) は 祭壇中部で使用するパーツの大きさYをそれぞれ二分探索することで求めることが可能です。
コード
def main():
import sys
from bisect import bisect_left, bisect_right
sys.setrecursionlimit(10 ** 6)
input = sys.stdin.readline
N = 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 b in B:
use_a = bisect_left(A, b) # 祭壇上部で使用できるパーツの数
inx_c = bisect_right(C, b) # 祭壇下部での二分探索結果
use_c = (len(C) - inx_c) # 祭壇下部で使用できるパーツの数
ans += use_a * use_c # 作成できる祭壇の種類
print(ans)
if __name__ == '__main__':
main()