前缀和

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;
      }
}

以上是关于前缀和的主要内容,如果未能解决你的问题,请参考以下文章

VSCode创建自定义用户片段

JavaScript笔试题(js高级代码片段)

仅公开路由的 .NET OData API 子集(排除 API 返回 404)

POJ-2752(KMP算法+前缀数组的应用)

XML 属性未获取命名空间前缀

片段和活动之间的核心区别是啥?哪些代码可以写成片段?