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