二维前缀和详解

引入

还是先从例题引入,给你一个二维平面,要求在$\Theta(1)$的时间复杂度内求出一个矩形内数的和。

显然,对于极端情况,二维平面退化成一维,那么我么可以用前缀和数组轻松解决,放在二维平面有该怎么办呢?

我们就要进入一个新的名词:二维前缀和


何谓二位前缀和

我们可以感性的将其理解为建立在二维平面上的前缀和,如下图:

红色区域所有数的和即为二维前缀和中点$(i,j)$的值。


如何预处理

类比一维前缀和,我们可以在$\Theta(n)$的时间复杂度下预处理,如下代码:

a[i]+=a[i-1];

那么对于二维前缀和,我们怎么预处理呢?

先给出算式:

Map[i][j]+=Map[i-1][j]+Map[i][j-1]-Map[i-1][j-1]; 

类比一维前缀和,因为我们从左到右在计算$a[i]$的时候已经知道了$a[i-1]$的值,所以同理,我们从左上向右下在计算$Map[i][j]$的时候已经知道了它右上所有点的前缀和,也就是知道了$Map[i-1][j]$、$Map[i][j-1]$和$Map[i-1][j-1]$的值,那么现在考虑为什么要做如上的运算。

其中,$Map[i][j]$的初始值即为点$(i,j)$的权值,如图:

那么现在,我们要求前缀和,也就是要加上下图中橙色区域:

而我们加上的$Map[i-1][j]$即为下图蓝色区域:

加上的$Map[i][j-1]$即为下图绿色区域:

然后我们会发现,有一部分重叠了,如下图紫色区域:

而这部分就是我们要减去的$Map[i-1][j-1]$。

那么我们的预处理就完成了。

时间复杂度:$\Theta(n\times m)$,与一维中的$\Theta(n)$预处理同理。


如何查询

依然是类比一维前缀和,对于查询区间$(l,r)$的值,我们可以用如下代码进行$\Theta(1)$的查询:

sum=a[r]-a[l-1];

也就是说,用右端点的前缀和值减去左端点$-1$的前缀和值即得到了区间$(l,r)$的和,如下图:

那么对于二维前缀和,我们有应该怎么办呢?

对于计算矩形$(x1,y1)\sim (x2,y2)$的和,先给出如下算式:

sum=Map[x2][y2]-Map[x1-1][y2]-Map[x2][y1-1]+Map[x1-1][y1-1];

下面来理解算式:

现在我们要求下图中红色区域的权值和:

而我们已经预处理好了前缀和,但是我们还不直接知道矩形$(x1,y1)\sim (x2,y2)$的权值和,那么我们考虑怎么减去那部分。

我们已经知道了$Map[x2][y2]$,而我们需要减去下图中橙色区域:

那么我们先减去$Map[x1-1][y2]$,也就是下图中蓝色区域:

然后再减去$Map[x2][y1-1]$,也就是下图中绿色区域:

然后,我们发现我们多减去了一部分,要把它加回来,而这部分就是$Map[x1-1][y1-1]$,如下图紫色部分:

这样,我们就成功的得到了需要求和的部分的值。

时间复杂度:$\Theta(1)$,与一维前缀和的$\Theta(1)$同理。


例题

那么现在对于二维前缀和的讲解就结束了,下面推荐几道我觉得不错的考察二维前缀和的题,大概$NOIP$难度:

$\alpha.$任(duty)

还在完善……


rp++

posted @ 2019-09-04 21:46  HEOI-动动  阅读(681)  评论(0编辑  收藏  举报