前缀和
前缀和分为一维前缀和与二维前缀和,作为最最最最基础的算法之一,我可以说,该方法可以用于很多很多问题,就像实际的下车问题,求地域的问题等等,都可以用到前缀和算法,那我们先说一说什么是前缀和。
1.前缀和
前缀和是指某序列的前n项和,可以把它理解为数学上的数列的前n项和,而差分可以看成前缀和的逆运算。合理的使用前缀和与差分2.,可以将某些复杂的问题简单化。
2.前缀和算法有什么作用?
比如这个题目:
我们如果用底层逻辑水题的话,也是可以水过的,但是当我们了解了前缀和这个算法之后,就会发现这个题很简单。
题解:
这是一个很典型的一维前缀和,给定一个序列,用数组S来储存数列,用a来储存前缀和,用b来储存异或和。
#include<stdio.h>
int main(){
long long n,m;
scanf("%lld %lld",&n,&m);
long long s[n+1],a[n+1],b[n+1];
s[0]=0;
a[0]=0;
b[0]=0;
for(long long i=1;i<=n;i++)
{
scanf("%lld",&s[i]);
}
for(long long x=1;x<=n;x++)
{
a[x]=a[x-1]+s[x];
}
for(long long p=1;p<=n;p++)
{
b[p]=b[p-1]^s[p];
}
for(long long j=0,x,y,z;j<m;j++)
{
scanf("%lld %lld %lld",&x,&y,&z);
if(x==1)
{
printf("%lld\n",a[z]-a[y-1]);
};
if(x==2)
{
printf("%lld\n",b[z]^b[y-1]);
}
}
return 0;
}
根据上面的意思,就是a[1]=s[1]; a[2]=s[1]+s[2]; a[3]=s[1]+s[2]+s[3]......
3.一维前缀和
我们通过上面的题目对前缀和有了初步的了解,那我接下来就开始讲一维前缀和。
一维一维,顾名思义和一维数组差不多。
那么我们用一个数组a[n]储存一组数据,用另一个数组s[n]来储存从1~n的和,这样就构成了一个前缀和。
那我们接下来通过题目来对它有更深入的了解....
这个时候要我们算从l到r的和,用前缀和那不就是很简单嘛,s[r]-s[l-1]就是l到r之间的和了,那么接下来,3,2,1上代码!
#include<stdio.h>
const int N=1e5+10;
int a[N],sum[N];
int main()
{
int n,m,x;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
sum[i]=x+sum[i-1];
}
while(m--)
{
int l,r;
scanf("%d %d",&l,&r);
printf("%d",sum[r]-sum[l-1]);
}
return 0;
}
2.二维前缀和
对一维前缀和有了了解,那二维前缀和对你来说就是小菜一碟了!
那今天的分享就到此结束啦,我们下次再说差分!