BISHI110 【模板】静态区间和(前缀和)¶
简单通过率 47.74%python3样例通过牛客 AC
讲解章节:前缀和与差分
一句话
n 个数、q 次区间求和查询。
解题思路¶
这题考什么¶
前缀和模板。令 S[k] = a_1 + ... + a_k(S[0] = 0),则
预处理 O(n),每次查询 O(1)。
数据规模与复杂度¶
n, q <= 1e6。O(n + q)。 暴力每次扫区间是 1e12 必挂;线段树 / 树状数组能做但完全没必要 (没有修改操作,前缀和是最优解,常数也最小)。
Python 的坑(本题的真正难点全在这里)¶
- IO 就是瓶颈:输入约 3e6 个整数(≈ 20 MB 文本),输出 1e6 行。 必须 sys.stdin.buffer.read().split() 一次读完, 输出 "\n".join 拼成一整块再一次 write; 用 input() / print() 会慢一两个数量级;
- 前缀和用 itertools.accumulate(C 层循环),
比 Python 的
for累加快好几倍; list(map(int, ...))也是 C 层循环,比列表推导快;- 询问的 l、r 直接用
int()转,配合游标推进; 这里把 l、r 的 token 用切片一次性取出再 map(int) 转换, 再用 zip 配对,避免 1e6 次的下标算术。
坑在哪¶
- a_i 可以是负数,前缀和不再单调,但公式不受影响;
- 和的绝对值最大 1e6 * 1e9 = 1e15,C++ 必须 long long;Python 无忧;
- 下标是 1-based,S 要多留一位 0。
参考实现¶
[:octicons-arrow-left-16: BISHI109](BISHI109.md) [BISHI111 :octicons-arrow-right-16:](BISHI111.md)