0
0

前回のを参考に、
今回は区間和ってことだから
おそらく区間ごとに和を取ってそれを配列に入れて
それらを差し引きすればいけるんじゃないかなと思って
そうしてみました。

N,K = map(int,input().split())
A = [int(input()) for _ in range(N)]
ans = A[:]
for i in range(1,N-1):
    ans[i] += ans[i+1]
    
print(ans)    

for _ in range(K):
    A,B = map(int,input().split())
    print(ans[A-1] + ans[B-1])

ただ、ケース1の2つ目で-10足りないことが判明し。
計算をしてみたところ考え方としてはちょっと違うようです。
時間もなかったのでちょっと答えを見てみました。

うーん。。。別に累積和はそのままでよかったみたいです。
ただ計算式が間違っていたようで。
区間を計算するには累積和の一番大きいやつ(4)から、一番小さいやつ(2(−1))を引く感じでよかったみたいです。
これで考えると、たしかに1番目と2番めはなぜか2番目だけ出力すればいいという謎が解けます。

ちょっとケース1の例で。
16
88
10
-65
2 4
1 2

[0, 16, 104, 114, 49]
33
104

0番目=0
1番目=16
2番目=104
3番目=114
4番目=49
累積和はこの通り。

2番目〜4番目の区間の和は88+10+(−65)=33
これは、4番目の49から2番目(−1、つまり1番目)の16をひいた数と同じ
次に
1番目〜2番目の区間の和は16+88=104 で、これは2番目104から1番目(−1)をひいた数と同じ
というわけでロジックがわかってきました。


N, K = map(int, input().split())
A = [int(input()) for _ in range(N)]
#累積和を作る
ans = [0] + A[:]
for i in range(1, N + 1):
    ans[i] += ans[i - 1]


for _ in range(K):
    left, right = map(int, input().split())
    print(ans[right] - ans[left - 1])

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