前缀和&差分 精讲(一维、二维、附例题!)

这篇文章是我寻找众多博客总结归纳的,还有找到的部分经典例题,相信看完的你一定会有新的感悟!加油!

一、一维前缀和

一维的前缀和数组sum[ i ]就是存的是 前i个数的总和
那么x到y区间的总和就是 sum[ y ] - sum[ x ]

应用

1、求一个数前面的所有数的和:递推;

2、求较多区间( l , r )之间的数的和:求前缀和之后 ans=a[r]-a[l-1];

例:HJ浇花color the ball;

3、多组数据,每组数据都用同一总数组来操作,如果一组数据一组数据遍历的话很容易超时,那么可以将那个总数组答案化(即,将该数组修改成接下来的每组数据需要的数),接着按输入找数组就行了。

例:Olympiad

4、将两种不同的物品分离,求最少的操作次数:一种物品从前面取前缀和,另一种从后面取“后缀和”,遍历所有点,总个数去掉两个数组里数即为不符合的需要改动的个数。

例:战马列队

二、二维前缀和

二维的前缀和如sum[ i ][ j ]是指 (i,j)点的左上角的矩阵(从(1,1)开始)的各数总和。

求二维前缀和的方法:

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

以下是对该式子的解释:
在这里插入图片描述

如图:图一点(i,j)的意义:红色区域的面积;假设其周围的数已求出前缀和,那么(i,j-1)点就是图二黄色区域的面积,(i-1,j)就是图三蓝色区域的面积。那(i,j)的求法是图一整个红色区域去点黄色和蓝色区域?不,多加了绿色区域,还要去掉绿色区域;
即:a[i][j]=a[i-1][j]+a[i][j-1]-a[i-1][j-1];

应用可以快速的求出矩阵中任何一个子矩阵的和,如:
1、求长为l且右下角顶点为(i,j)的正方形面积:

 sum[i][j] - sum[i][j-l] - sum[i-l][j] + sum[i-l][j-l]

2、求左上角为(x1,y1),右下角为(x2,y2)的矩形的面积:

sum[x2,y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1];

在这里插入图片描述

前提:矩阵中的所有的数已求前缀和;
我们要算的是 D区域 (以(x1,y1)为左上角,(x2,y2)为右下角的矩形) 的面积,那么sum[x2,y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1]即总的面积去掉A+B的面积去掉A+C的面积,多减了一个A的面积,再加上。

例:激光炸弹最大正方形Conturbatio

三、一维差分

可以简单理解为:“相邻两个数之差”;
差分就是数组b对于数组a有b[ i ] = a[ i ] - a[ i-1 ](2 <= i <= n),b就是a的差分。
性质:差分的前缀和是原数组,前缀和的差分也是原数组(差分是前缀和的逆状态;
应用:给定多个区间,将区间里的所有数相加或相减一个数。如果挨个区间遍历的话,很可能超时,那么可以用差分
例如 将区间(l,r)中的所有的数+1,将所有数差分后,a[l]++,a[r+1]--; 再求前缀和即为变换后的区间;

例:fancy的区间最高的牛增减序列

四、二维差分

根据二维前缀和表示的是右上角矩形的和,由于差分只涉及前面相邻的数(由一维可以推出),并且由前面范围的数相加得到这个位置的数。那么类比二维前缀和和一维差分,可以简单推测出二维差分的公式:

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

(二维差分就是二维前缀和的逆运算,所以与正好二维前缀和公式相反。)

性质

  1. 二位前缀和通过二维差分后变换成原数组;
  2. 二维差分通过二维前缀和后也会变成原数组;

如何从差分矩阵得到原矩阵呢?
a[i][j]=f[i][j]+f[i-1][j]+f[i][j-1]-f[i-1][j-1]; (即前缀和公式);
应用:将所给矩形中的所有的数加上一个数或减掉一个数
例:将以(x1,y1)为左上角,以(x2,y2)为右下角的矩形中的所有的数+c:

 f[x1][y1]+=c;   f[x1][y2+1]-=c;   f[x2+1][y1]-=c;    f[x2+1][y2+1]+=c;

再将二维数组求前缀和即得到变换后的数组;
对上述公式的解释:

在这里插入图片描述

  1. 前提:数组已二维差分;
  2. 如图:我们的目的是将图一紫色矩形中的所有数字+c,在一维差分中,区间中的数加减只需对边界操作,二维差分也是如此。
    只是将点(x1,y1)+c后会影响到全部的区域(即图二黄色区域,原因:之后要取前缀和),为了消除影响,则要(x1,y2+1)-c,(即图三蓝色区域),(x2+1,y1)-c(即图四蓝色区域),会发现有重复部分,去掉重复:(x2+1,y2+1)+c;

模板:二维差分模板——差分矩阵

例题:方格稿纸

参考来源:
https://blog.csdn.net/Zeolim/article/details/86770827
https://blog.csdn.net/mrcrack/article/details/99701435
https://blog.csdn.net/justidle/article/details/104506724

本蒻第一次写博客hh,肯定有不足的地方,欢迎各位大佬前来指正!

如果觉得还不错就鼓励一下吧hh(逃~~

猜你喜欢

转载自blog.csdn.net/Mr_dimple/article/details/113496474