【競プロ】過去問精選100問「AtCoder Beginner Contest 077 C - Snuke Festival」解法
Free-PhotosによるPixabayからの画像

このシリーズではレッドコーダーが教える、競プロ・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()

おすすめの記事