前缀和与二维前缀和
前缀和
前缀和,顾名思义,就是所有前缀之和,给一个最基本的例子:
如图,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 }