Atcoder Beginner Contests 194 C - Squared Error (Python 3.8.2)
皆さんお久しぶりです!!
今日はなんとなく記事を書きたい気分になったので書きたいと思います。
問題はこちら!!
解法
とりあえず眺めててもわからないので具体例を考えてみる。
- n = 4のとき
といったような式が出てきます。
前半の2乗の部分はO(N)で計算することができ、後ろの一つずつ項が小さくなっていくものは前処理で累積和を取っておくとO(N)で計算することが可能です。
一般にnのときでやってみると以下のようになります。
が得られるのであとはこれを累積和を用いて計算するだけです!!
提出コード
n = int(input()) a = list(map(int,input().split())) b = [0] * n # Bnを後ろから累積和を取る for i in range(n): b[i] = a[i] b = b[::-1] wa = [0] * n wa[0] = b[0] for i in range(n - 1): wa[i + 1] += wa[i] + b[i + 1] x = y = z = 0 for i in range(n - 1): x += (n - 1 - i) * (a[i] ** 2) for i in range(n - 1): y -= 2 * a[i] * (wa[-2 - i]) for i in range(n - 1): z += (i + 1) * (a[i + 1] ** 2) print(x + y + z)
最後に
今回の問題は前回の復習が生きたおかげで速く解くことができたのでよかったです!!
今後も数問にはたくさん挑戦して慣れていきたいものです。
間違いなどがあれば指摘の方をよろしくお願いします。
ありがとうございました!