码迷,mamicode.com
首页 > 其他好文 > 详细

前缀和

时间:2020-06-23 01:25:23      阅读:110      评论:0      收藏:0      [点我收藏+]

标签:out   clu   序列   好处   lan   alt   前缀和   int   info   

前缀和

输入长度为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;
      }
}

前缀和

标签:out   clu   序列   好处   lan   alt   前缀和   int   info   

原文地址:https://www.cnblogs.com/waitti/p/13179701.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!