前缀和
Posted waitti
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了前缀和相关的知识,希望对你有一定的参考价值。
前缀和
输入长度为n的序列,给出m个询问,每个询问给出l,r,求sum([l, r])
显然我们不能对于每个询问都从l加到r,这样的复杂度是O(nm)。
所以引出了前缀和,设原数组为a[],我们新建一个数组为sum[],对于sum数组,我们令sum[1] = a[1], sum[2] = a[1] + a[2], sum[3] = a[1] + a[2] + a[3] ...
不难看出,sum[i] = a[i] + sum[i - 1]。
这样做的好处是什么呢?我们可以用O(1)的时间来求一个连续段内的和。
对于区间[l, r],sum([l, r]) = sum[r] - sum[l - 1]。
当然我们并不需要一个新的数组来存前缀和,我们可以直接在原数组上操作。
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int a[N];
int main(){
int n,m,l,r;
cin >> n >> m;
for(int i = 1;i <= n; i++){
cin >> a[i];
a[i] += a[i - 1];
}
while(m--){
cin >> l >> r;
cout << a[r] - a[l - 1] << endl;
}
}
以上是关于前缀和的主要内容,如果未能解决你的问题,请参考以下文章