题目描述
给定 n个正整数组成的数列 $a_1, a_2, \cdots, a_n和 m 个区间 [l_i,r_i],分别求这 m 个区间的区间和。
输入格式
共 n+m+2 行。
第一行,为一个正整数 n 。
第二行,为 n 个正整数 a_1,a_2, \cdots ,a_n
第三行,为一个正整数 m 。
第 4 到第 n+m+2 行,每行为两个正整数 l_i,r_i ,满足 1\le l_i\le r_i\le n
输出格式
共 m 行。
第 i 行为第 i 组答案的询问。
样例 1
样例输入 1
4
4 3 2 1
2
1 4
2 3
样例输出 #1
10
5
提示
样例解释:第 1 到第 4 个数加起来和为 10。第 2 个数到第 3 个数加起来和为 5。
对于 50% 的数据:n,m\le 1000 ;
对于 100% 的数据:1 \leq n,m\le 10^5,1 \leq a_i\le 10^4。
题目详解:
题目要求对给定的n个数中的m个区间进行求和操作,可以使用前缀和来优化求解过程。
首先我们需要预处理出前缀和数组 prefix\_sum ,其中 prefix\_sum_i 表示 a 数组前 i 个数的和,可以通过以下式子计算得到:
prefix\_sum_i = prefix\_sum_{i-1} + a_i, \ 1\le i \le n
这样我们就可以在 O(1 )时间内计算出区间 [l,r 的和,即:
sum_{l,r} = prefix\_sum_r - prefix\_sum_{l-1}
因为 prefix\_sum 数组的长度为 (n+1) ,所以我们需要将前缀和数组的长度设置为 (n+1)
最后,根据题目要求,输出 m 个区间的和即可。整个算法的时间复杂度为 O(n+m) 。
代码展示:
n = int(input())
a = list(map(int, input().split()))
m = int(input())
prefix_sum = [0] * (n+1)
for i in range(1, n+1):
prefix_sum[i] = prefix_sum[i-1] + a[i-1]
for i in range(m):
l, r = map(int, input().split())
print(prefix_sum[r] - prefix_sum[l-1])