一.前缀和模板
1.前缀和讲解
前缀和模板,前缀和比较简单,掌握原理即可写出模板,因此本次先讲解后出模板。
首先了解前缀和的概念。一个长度为n的数组,它的前缀和
等于
的和。
因此利用递推可以得到:
则如果想计算前缀和,就能利用它可以快速计算出数组中任意区间的和,即:
可知这说明复杂度为的区间和计算优化到了
的前缀和计算。
2.前缀和模板
for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i];//这段代码是用来计算从1到n的和。
//s数组是用来存储这个和的,a数组是用来存储1到n的数。
//在每次循环中,都会将s[i]的值更新为s[i-1]加上当前a[i]的值。
int a,b;
cin>>a>>b;
printf("%d\n",s[b]-s[a-1]);//这段代码用来输出从a到b的和。
//s[b]表示从1到b的和,s[a-1]表示从1到a-1的和,这两个值的差就是a到b的和。
二.习题
通过上面模板讲解,我相信大家已经了解了前缀和的思想,快在本地编译器上练习一下吧!
题目描述:
题目讲解:
看完上面模板讲解,相信大家已经理解了,这纯粹是模板题,就不废话了,直接上代码。
完整代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],s[N];
int main(){
int n,m;
cin>>n;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i];
cin>>m;
while(m--){
int a,b;
cin>>a>>b;
printf("%d\n",s[b]-s[a-1]);
}
return 0;
}
算法要勤加练习,快多多去练习吧!
感谢大家观看,请给作者一个赞和收藏吧!