AT274の技術だったりなかったり

あっとのTECH LOG

競プロのこととか技術のこととか。たまに日常を書きます。

ABC171 D - Replacing

問題原文

atcoder.jp

解法

愚直にやると当然間に合わない。
あらかじめ全要素の和を計算しておいて、差分更新だけするようにやれば間に合う。
差分更新は各数の個数を持っておけばできる。

実装

from collections import Counter
N = int(input())
A = list(map(int, input().split()))
C = Counter(A)

Q = int(input())
SUM = sum(A)
for q in range(Q):
    b, c = map(int, input().split())
    SUM -= C[b] * b
    SUM += C[b] * c
    C[c] += C[b]
    C[b] = 0
    print(SUM)

こういうのは Counter の十八番。
b の個数が0になるのでちょっと注意。
素数も持つUnionFindでもできそうですね。

感想

PASTに出そう。