前缀和定义:前缀和就是从位置1到位置i这个区间内的所有的数字之和。
那这是什么意思呢?简单举个例子:
给定一个数列如下:
1 10 9 41 2 7 7
前缀和的用处:求取某个数组第l个元素到第r个元素的和,例如求第l项到第r项,正常算法要循环遍历一遍也就是用要o(n)的复杂度,利用前缀和我们只需要用s[r]-s[l-1]就行,这样复杂度就变为o(1),大大的优化时间。(前缀和是在读入时就全部处理出来的)
例题:![](https://i-blog.csdnimg.cn/blog_migrate/b80d6d3a456a9bd13e989bcf1451c87c.png)
看这题目,很容易发现如果我们真按照原题的方式一个个乘必然会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](紫色部分)
例题:
二维前缀和裸题,自己看看吧