今天来学习一下前缀和
老样子,只是原理和基础题
前缀和的做法如下:
当想要求一个数组某个区间的和,但是直接暴力超时的话可以考虑前缀和
先来看这道题:

看一下数据,n,m均可以为1e5,暴力的时间复杂度就是O(1e10),绝对超时,这时候前缀和就派上用场了
我们可以记数组a,s,a[i]里存输入的数,s[i]里存的就是a数组前i位的和
由此,我们可以写出一个赋值语句:
s[i]=s[i-1]+a[i];
再反过来看题目,却发现题目让求区间[l,r]之间的和,有些人就蒙了,大家再想想有没有什么办法呢?
很好,我们可以拿s[r]-s[l-1],就能得到这个区间之间的总和
因为s[r]记录了前r个数的总和,s[l-1]记录了前l-1个数的总和,两者相减便是答案
假设a=1,3,6,7,9,13,16,8;l=3;r=7
这时,s=1,4,10,17,26,39,55,63
我们拿s[r](55)-s[l-1](4)便是要求的值51了
所以这道题的代码也就不难了
#include <bits/stdc++.h>
using namespace std;
int n,m;
int num[1000010],S[1000010];
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>num[i];
S[i]=S[i-1]+num[i];
}
cin>>m;
while(m--){
int l,r;
cin>>l>>r;
cout<<S[r]-S[l-1]<<"\n";
}
return 0;
}
完结撒花
663

被折叠的 条评论
为什么被折叠?



