期間ごとの 売上の合計
- 累積和
- 問題 03
- ふつう
- 目安 31 分
毎日の
本番の
入力は
問題
ある
入力の形式
N Q
a_1 a_2 ... a_N
l_1 r_1
l_2 r_2
...
l_Q r_Q1 行目に
出力の形式
Q 行を
制約
- N と Q は、
どちらも 1 以上 100000 以下です - 売上 a_i は、
0 以上 1000 以下の整数です - 質問は、
1 以上 l 以下 r 以下 N 以下を 満たします
入力と出力の例
例 1
5 日間の
入力
5 3 3 1 4 1 5 1 5 2 3 4 4
出力
14 5 1
例 2
1 日だけで、
入力
1 1 7 1 1
出力
7
ヒント
まだ開いていません
付箋は 3 枚。下の段ほど答えに近づきます
ヒント 2
ヒント 3答えに近い
全部の
先に
解答
売上を
Python
Python
import sys
data = sys.stdin.read().split()
n, q = int(data[0]), int(data[1])
sales = list(map(int, data[2:2 + n]))
prefix = [0] * (n + 1)
for i in range(n):
prefix[i + 1] = prefix[i] + sales[i]
answers = []
for i in range(q):
l = int(data[2 + n + 2 * i])
r = int(data[3 + n + 2 * i])
answers.append(prefix[r] - prefix[l - 1])
print("\n".join(map(str, answers)))JavaScript
JavaScript
const data = require("fs").readFileSync(0, "utf8").split(/\s+/).filter(Boolean).map(Number);
const n = data[0];
const q = data[1];
const sales = data.slice(2, 2 + n);
const prefix = new Array(n + 1).fill(0);
for (let i = 0; i < n; i++) {
prefix[i + 1] = prefix[i] + sales[i];
}
const answers = [];
for (let i = 0; i < q; i++) {
const l = data[2 + n + 2 * i];
const r = data[3 + n + 2 * i];
answers.push(prefix[r] - prefix[l - 1]);
}
console.log(answers.join("\n"));計算量
時間は O(N + Q) です。sum(sales[l - 1:r]) のように 1 行で
よく ある間違い
- 累積和の 0 番目に 0 を
置かず、 l が 1 の ときに s[l - 1]が範囲の 外に なる、 または 最初の 日が 数え落とされる - 日付が 1 から
数える 入力なのに、 配列の 番号が 0 から 数える ことを 忘れて、 1 つずれる。 s[r] - s[l - 1]の l - 1 をs[l]と書くと、 l 日目の 売上が 引かれてしまいます - 答えを 1 つずつ print して
出力が 遅くなる。 Q が 10 万行なら、 まとめて 1 回で 出力する ほうが 速く書けます - 入力を
input()で 1行ずつ 読んで、 Python で 10 万行の 読み込みに 時間を 使いすぎる。 sys.stdin.read()で全部を 一度に 読むと 速くなります
解答を動かした版 Python 3.12.14Node.js 22.23.4確認日 2026/10/31