前缀和算法

前缀和

   前缀和分为一维前缀和与二维前缀和,作为最最最最基础的算法之一,我可以说,该方法可以用于很多很多问题,就像实际的下车问题,求地域的问题等等,都可以用到前缀和算法,那我们先说一说什么是前缀和。

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.二维前缀和

对一维前缀和有了了解,那二维前缀和对你来说就是小菜一碟了! 

 

 那今天的分享就到此结束啦,我们下次再说差分!

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值