AtCoder Beginner Contest 171 D問題

D問題

難易度:茶色

10~12分で解けました。

並べられた整数列Aに対して
Biの整数に該当する要素を全てCiに置き換え、
最終的な合計値を求めます。

整数列の要素数やBiの個数が100000個存在します。
そのため二重ループするとTLEとなる確率が高い。

よってcollections.Counterで、
各整数ごとに頻出回数をまとめたリスト'a'を作成します。。

「Biに該当する整数の数」と「新たに変換するCiと変換前のBiの差分」の積をとります。
これを合計値に反映させ、
整数頻出リスト'a'を更新します。

以下のコードはACです。

import collections
 
n = int(input())
A = list(map(int,input().split()))
a = collections.Counter(A)
sum_ = sum(A)
 
Q = int(input())
B,C = [],[]
for i in range(Q):
  lis = list(map(int,input().split()))
  B.append(lis[0])
  C.append(lis[1])
 
for j,b in enumerate(B):
  sum_+=a[b]*(C[j]-b)
  a[C[j]]+=a[b]
  a[b]=0
  print(sum_)