前缀和求解问题的一般过程:
前缀和很好理解,就是用sum[i]来表示数组a[i]前i个数的和。
1、利用sum[i]=a[i]+sum[i-1]前缀和式在输入时求出前缀和;
2、依次读入区间的值,然后将对于区间的求和操作转化为对于区间端点操作加减,对于每个 [l,r] 区间的求和操作都转化为对端点a[r]-a[l-1]的操作。
3、输出答案。
既:
输 入 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],并输出
实际问题的求解:
题目描述
教室外有 N棵树,根据不同的位置和树种,学校已经对其进行了多年的维护。
由于维护费用也称区间分布,所以常常需要统一个区间里的树木的维护开销。
现给定一个长度为 N 的数组 A 以及 M 个查询,Ai 表示第 i 棵树到维护费用。对于每个查询包含一个区间,园艺人员想知道该区间内的树木维护的开销是多少。
输入描述
每组输入的第一行有两个整数 N和 M。N 代表马路的共计多少棵树,M 代表区间的数目,N 和 M 之间用一个空格隔开。
接下来的一行,包含 N 个数 ,分别表示每棵树的维护费用,每个数之间用空格隔开。
接下来的 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
具体代码:
#include<iostream>
using namespace std;
int main()
{
int n, m, l, r;
cin >> n >> m;
int* tree = new int[n+1];
int* treeSum = new int[n+1];
tree[0] = 0;
treeSum[0] = 0;
for (int i = 1; i <= n; i++)
{
cin >> tree[i];
treeSum[i] = tree[i] + treeSum[i-1];
}
while (m--)
{
cin >> l >> r;
cout << treeSum[r] - treeSum[l - 1] << endl;
}
}