前缀和与二维前缀和

前缀和定义:前缀和就是从位置1到位置i这个区间内的所有的数字之和。

那这是什么意思呢?简单举个例子:

给定一个数列如下:

1        10        9        41        2        7        7

 前缀和的用处:求取某个数组第l个元素到第r个元素的和,例如求第l项到第r项,正常算法要循环遍历一遍也就是用要o(n)的复杂度,利用前缀和我们只需要用s[r]-s[l-1]就行,这样复杂度就变为o(1),大大的优化时间。(前缀和是在读入时就全部处理出来的)

例题:

 看这题目,很容易发现如果我们真按照原题的方式一个个乘必然会tle,那我们就重新观察一下原来的式子,可以发现:s=a[1]*(a[2]+...+a[n])+a[2]*(a[2]+a[3]+...a[n])+a[3]*(a[4]+a[5]+...a[n])+.....

那我们就可以先预处理出前缀和,式子就变成了s=a[1]*(s[n]-s[1])+a[2]*(s[n]-s[2])+a[3]*(s[n]-s[3])...

就可以很轻易的求出来了(代码很容易,我就不写了)

二维前缀和

顾名思义就是二维的前缀和,前缀和可以看做是一维的在一条线上操作,那么二维即是在一个平面上操作。(好像有点抽象)

打个比方:给你一个二维数组,你要求它某个矩形范围之内的和(其他形式也可以求,按照需求可以自己推出,这里先简单介绍下最基本的)

那我们处理出的前缀和即是[1,1]到[n,m]的这一个矩形范围内的元素和

例如n=3,m=4,前缀和s[3,4]就是红笔圈出的元素和

我们所要求s[3,4]那么就是相当于求下图中红的部分+蓝的部分-绿的部分+a[3,4]

 

(不是很清晰,将就着看吧)

 那我们很容易推导出预处理的公式:s[i,j]=s[i-1,j]+s[i,j-1]-s[i-1,j-1]+a[i,j](记得最开始初始化要把数组全部赋值为0,要不处理边界会出现问题),那我们要求中间某一个矩形(左上角坐标:[l,r],右下角坐标:[x,y])的和,例如:

也可以发现所要求的部分就是下图红色部分 -蓝色部分-绿色部分+紫色部分

 即所求=s[x,y](红色部分)-s[l-1,y](蓝色部分)-s[x,r-1](绿色部分)+s[l-1,r-1](紫色部分)

例题:

二维前缀和裸题,自己看看吧 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值