前缀和

前缀和

输入长度为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;
      }
}
原文地址:https://www.cnblogs.com/waitti/p/13179701.html