【深进1.例1】求区间和

题目描述

给定 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])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zx-Deere

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值