前缀和与二维前缀和

前缀和与二维前缀和

前缀和

  前缀和,顾名思义,就是所有前缀之和,给一个最基本的例子:

  

 

  如图,a为原始数组,s为完成预处理后的数组,很容易看出来s[ i ]=s[ i – 1 ]+a[ i ],而也就是s[ i ]=a[1]+a[2]+……+a[ i ],需要注意的是记s[0]=0

  那么,如果我想要知道一个区间的区间和该怎么做呢?其实很简单,例如要求区间3~5的区间和,就可以用s[5]-s[2]=19-8=11。这里同样需要注意当减去区间左边界时需要将其减1,及求l~r的区间和,是用s[ r ]-s[ l-1 ]

  根据以上求区间前缀和的思路可以完成以下代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define MAXN 100010
 4 int n,m;
 5 int a[MAXN],s[MAXN];
 6 int main()
 7 {
 8     cin>>n; //数组的长度 
 9     for(int i=1;i<=n;i++)
10     {
11         cin>>a[i];  
12         s[i]=s[i-1]+a[i]; //这里就是上面讲到的预处理的方法 
13     }
14     cin>>m; //读入区间数量 
15     for(int i=1;i<=m;i++)
16     {
17         int l,r;
18         cin>>l>>r; //读入区间的左边界和右边界 
19         cout<<s[r]-s[l-1]<<endl; //输出区间和 
20     }
21     return 0;
22 } 
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » 前缀和与二维前缀和