什么是前缀和?
比如给你一个数组a[10]={0,1,2,3,4,5,6,7,8,9};它的前缀和数组sum[10]={0,1,3,6,10,15,21,28,36,45},
sum[0]=a[0];
for(int i=1;i<10;i++)
{
sum[i]=sum[i-1]+a[i];
}
前缀和是一个很重要的预处理,可以大大降低某些题的复杂度。
例如,给定一个长度为n的数列,对于m次询问,每次给出一个左端点,一个右端点,求这个闭区间内数列数值的和。
一般来说,我们可以很轻易地用for(int i=l;i<=r;i++)跑完这个区间,从而求出总和,这样的方法谁都会,比赛中一般不会让你AC的,因为这种算法额时间复杂度为O(n*m),一不小心就会TLE,所以我们要找到复杂度更小的算法——前缀和。
const int M=2e5+5;
const int INF=0x3f3f3f3f;
int a[M],sum[M];
int main()
{
IOS;
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum[i]=sum[i-1]+a[i];
}
int m;
cin>>m;
for(int i=1;i<=m;i++)
{
int l,r;
cin>>l>>r;
int ans=sum[r]-sum[l-1];//数据大的时候开long long
cout<<ans<<endl;
}
}
可以看出,这个时间复杂度明显降低,仅为O(n)。