差分详解

定义

一维差分

给定一个数组\(a:a[1],a[2]...\)
此时构造一个数组\(b\),令\(b[1]=a[1]\)\(b[2]=a[2]-a[1],b[3]=a[3]-a[2]...,b[i]=a[i]-a[i-1](i>1)\)
这样的数组\(b\)便是数组\(a\)的差分数组。

二维差分

给定一个二维数组\(mp\),用其储存一个矩阵,设该矩阵左上角元素为\((1,1)\),右下角为\((x,y)\)

二维前缀和(补充)

构造一个数组\(a\),使\(a[i][j](1 \le i\le x,1\le j \le y)\)表示为左上角坐标为\((1,1)\),右下角坐标为\((i,j)\)的矩阵中所有元素之和。
数组\(a\)就是数组\(mp\)的前缀和数组

构造差分数组

构造一个数组\(b\),使得\(b[i][j]=a[i][j]-a[i-1][j]-a[i][j-1]+a[i][j]\),这样的数组\(b\)就是\(mp\)的差分数组。

  1. 构造方法由前缀和数组的差分数组就是原数组推导而来
  2. 实际应用中二维差分数组常用\(diff\)定义

二维差分的简单应用

如果我们要在左上角是\((x1,y1)\),右下角是\((x2,y2)\)的矩形区间每个值都\(+a\),如下图所示
image
实际影响的部分为图1中紫色部分,红色部分不被影响。
对于前缀和而言,如图2,整个前缀和数组都被影响。

那么图1中红色部分呢?

对于差分而言,红色部分的差分(即图3、图4中蓝色部分)随着对前缀和的影响而多受到了一个\(+a\)的影响,因此应\(-a\)消除此影响。
而对两个蓝色部分的修改则重复对图5中绿色部分产生了\(-a\)的影响,而其本身又受到一个\(+a\)的影响,所以其实际上受了一个\(-a\)的影响。
综上,得到以下

diff[x1][y1] += a;
diff[x1][y2+1] -=a;
diff[x2+1][y1] -=a;
diff[x2+1][y2+1] += a;

树上差分

点差分

点差分基于子树和思想。
先构造以下三个数组:\(son,fa,cnt\)。其中\(son[i]\)表示节点\(i\)的儿子节点,\(fa[i]\)表示节点\(i\)的父亲节点,\(cnt[i]\)表示节点\(i\)被经过的次数。
举例:求从节点\(s\)到节点\(t\)的路径上每个节点被经过的次数(每经过一次视为点权\(+1\))。
显然该路径可分为两段:\(s\)--->\(LCA(s,t)\)\(LCA(s,t)\)--->\(t\)
因为差分的性质,所以在计算差分时,仅需对两端进行操作。
在求和过程中,我们需要进行dfs来进行对这两段的遍历。因此\(LCA(s,t)\)会被经过两次,多了一个不存在的\(+1\),故应\(-1\)

posted @ 2025-04-24 18:25  Kelojonle  阅读(63)  评论(0)    收藏  举报