二维前缀和与差分

鸣谢 这位爷。

前缀和与差分是比较简单经常用到作为预处理的大手子出现在各大场所并且是一对搭档。

一维的简简单单,二维的有点复杂。

二维前缀和与差分_第1张图片
从一个\(2 \times 2\)的矩阵开始看,从左上角到红色部分的前缀和肯定是由两个黄色部分加两个绿色部分做成的,左上角到黄色部分的前缀和很显然是一维前缀和做出来的,所以左上角到红色部分的前缀和很显然是由两个一维前缀和加起来减掉一个多加的的绿色部分,然后就可以拓展:
二维前缀和与差分_第2张图片
红色部分的前缀和显然由蓝色的加黄色的减去多加的绿色。

公式:
\[sum[i][j]=a[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]\]

然后求出前缀和之后怎么\(O(1)\)去查询呢?
二维前缀和与差分_第3张图片
如图所示,求紫色部分值,显然由黄色部分的前缀和减去两个蓝色部分的前缀和,再加上一个多减去的绿色部分。
公式:
\[sum[x2][y2]-sum[x2][y1-1]-sum[x1-1][y2]+sum[x1-1][y1-1]\]

然后二维差分就是他的兄弟.。因为差完分还原值的时候是通过对差分数组做前缀和进行还原,所以差分的时候也是根据前缀和的性质去差分。
二维前缀和与差分_第4张图片
要在紫色部分加上一个值,所以首先在开始处\((x1,y1)\)加上一个值,根据前缀和的性质,这次增加值影响到了从\((x1,y1)\)到右下角的矩阵,超出了要修改的范围,所以为了给两个蓝色消除影响,应该在\((x1,y2+1)\)\((x2+1,y2)\)处加上要修改值的相反数。但是这样的话会多消一个绿色区域,所以要在\((x2+1,y2+1)\)加上要修改的值来消除多消的影响。
公式:
\[dif[x1][y1]+=a,dif[x1][y2+1]-=a,dif[x2+1][y1]-=a,dif[x2+1][y2+1]+=a\]

又懂了。

你可能感兴趣的:(二维前缀和与差分)