競プロ部 累積和編 (2月2日〜2月21日)

この記事は約1分で読めます。

初めに

いすも法と尺取り法は別記事でやります

累積和とは

簡単に言えば、最初に下準備してその後の質問に爆速で答えるものです

例えば、、、

1 2 3 4 5 6 7 8 9

ていう配列があるとする(最初は0番目と考える)

0番目から2番目まで全て足すと?

6だよね

じゃあ0番目から5番目は?

21だよね

でもいちいち足すのめんどくさいよね

ここで累積和を使う

1 3 6 10 15 21 28 36 45

↑0番目から足したやつ

これ見たら答えるの速くなる

実装

1 2 3 4 5 6 7 8 9

↓ 最初を足す

0 0 0 0 0 0 0 0 0 ←数ぶん作る

1 2 3 4 5 6 7 8 9

  ↓ 足す

1 0 0 0 0 0 0 0 0

  ↑ 前の足す

プログラミング

この問題をやる

N = int(input())
A = list(map(int, input().split()))

# 累積和を求める
# acc[k]: 左から k 個分の総和
acc = [0] * (N+1)
for idx, a in enumerate(A):
    acc[idx+1] = acc[idx] + a

# 質問に答える
Q = int(input())
for _ in range(Q):
    k = int(input())
    print(acc[k])

こんな感じ

最後に

累積和は、まだ簡単にできるので極めれば強い

がんばれ!!

コメント

タイトルとURLをコピーしました