题目描述
教室外有 N 棵树(树的编号从 1∼N),根据不同的位置和树种,学校已经对其进行了多年的维护。
因为树的排列成线性,且非常长,我们可以将它们看作一条直线给他们编号。
由于已经维护了多年,每一个树都由学校的园艺人员进行了维护费用的统计。
每棵树的前期维护费用各不相同,但是由于未来需要要打药,所以有些树木的维护费用太高的话,就要重新种植。
由于维护费用也称区间分布,所以常常需要统一个区间里的树木的维护开销。
现给定一个长度为 N的数组 A 以及 M 个查询,Ai 表示第 i 棵树到维护费用。对于每个查询包含一个区间,园艺人员想知道该区间内的树木维护的开销是多少。
请你编写程序帮帮他!
输入描述
每组输入的第一行有两个整数 N和 M。N 代表马路的共计多少棵树,M 代表区间的数目,N 和 M 之间用一个空格隔开。
接下来的一行,包含 N 个数 A1,A2,⋯,AN,分别表示每棵树的维护费用,每个数之间用空格隔开。
接下来的 M 行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点 L 和终止点 R 的坐标。
输出描述
输出包括 M 行,每一行只包含一个整数,表示维护的开销。
输入输出样例
示例
输入
10 3
7 5 6 4 2 5 0 8 5 3
1 5
2 6
3 7
输出
24
22
17
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
这道题是对数组某个区间求和,因此可以用到前缀和思想只对区间端点操作就可以得到答案。
这道题正确的代码:
#include <iostream>
using namespace std;
int b[100001];
int sum[100001];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>b[i];
sum[i]+=b[i]+sum[i-1];
}
while(m--){
int l,r;
cin>>l>>r;
cout<<sum[r]-sum[l-1]<<endl;
}
return 0;
}
前缀和算法解题的基本思路:
- 利用 sum[i]=a[i]+sum[i-1]sum[i]=a[i]+sum[i−1] 差分式;
- 从第 1 项到 n 项,且第 0 项无数据默认为 0;
- 对于区间求和的操作转化为端点值相减。
前缀和一般解题过程:
输 入 N 和 M
输入 N 个值 并计算前缀和
for( int i=1;i<=N;i++)
输入a[i]
并计算sum[i]=sum[i-1]+a[i]
输入 M 个区间,计算结果
while(M)
M-=1
输入 L , R
计算 [r]-[l-1],并输出