0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

累積和

Last updated at Posted at 2024-04-05

ひとまずやってみたのですが、
ケース3と4でタイムオーバーになってしまいました。


N, K = map(int,input().split())
A = [int(input()) for _ in range(N)]
B = [int(input()) for _ in range(K)]

for i in B:
    sum = 0

    for j in range(0,i):
        sum += A[j]
        
    print(sum)


テーマが累積和っていうらしいですが

A_1 から A_i までの和を sum[i] とすると、
sum[i] = sum[i-1] + A[i] という関係が成り立つので
すべての i について sum[i] を計算しておく

ん???
ちょっとよくわかりませんでした。。。
でも調べると、

たとえば
3つの配列の要素が下にあり、与えられた整数がたとえば3だったら

69
12
28

69+12+28=?ってのが答えになる。
だけど累積和だと
69、81、109 と少しずつ足していきこれらを配列に入れて
たとえば整数が3だったらA配列の3番目なので109が答え、
整数が2だったら81が答え、
整数が1だったら69が答えとするやつで、
これだと、毎回1つずつ足していくだけなので計算量が減る、という考え方らしい。
たしかに毎回リクエストが与えられるたびに最初から計算していたら時間がかかってしまいますね。
そういう考え方か。
というわけで累積和のロジックを理解したのでやってみます。


N, K = map(int, input().split())
A = [int(input()) for _ in range(N)]
#上までは同じ
#Ansという配列を作成してそこに上と同じことをやっていく

#まず配列の要素をあらかじめ入れる(下の書き方で入れられる)
ans = [0] + A[:]

#ループで下の計算をすることでロジック通りの配列がえられる
for i in range(1, N + 1):
    ans[i] += ans[i - 1]

#後はリクエスト通りに配列の要素を出力するだけ
for _ in range(K):
    q = int(input())
    print(ans[q])

ちなみに15秒オーバーしてたケース3とケース4が0秒台に減りました。
累積和、恐ろしい子!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?