算法题(126):前缀和
审题:
本题需要我们将题目给出的数组的数据的[l,r]范围内的数据和打印
思路:
方法一:前缀和前缀和的思想就是预处理数据,通过空间换时间的方式提高代码效率
第一步:利用数组f将前缀和记录下来,f[i]表示索引1到索引i的和
第二步:计算区间之和:f[r]-f[l-1].本质上是将他们两个除了索引为l位置之外的公共部分去除
第三步:输出答案
解题:
#include<iostream> using namespace std; int n,q; const int N = 1e5+10; long long v[N];//记录数据 long long f[N];//前缀和数组 int l,r; int main() {cin >> n >> q;for(int i = 1; i <= n; i++){cin >> v[i];//前缀和预处理f[i] = f[i-1]+v[i];}while(q--){cin >> l >> r;cout << f[r]-f[l-1] << endl;}return 0; }
1.由于本题的数据值范围是1e9,所以我们使用long long类型的数组存储数据
2.我们可以直接在数据输入的时候进行预处理,减少遍历次数。且这里不用对i==1的情况特殊处理,因为f定义在全局域,所以会自动初始化为0,f[1] = f[0]+v[1]:这里的f[0]就是0,所以没什么问题。
【模板】前缀和