一维以及二维的差分的简述
差分,也就是数与数之间的差值。拿一维差分来举例子,将差分设为c[ ]数组,原数为a[ ],那么
$c[i]=a[i]-a[i-1]$
这便是简单的差分数组;
那么要他何用?
最为主要的作用就是区间的修改,那么在修改之前,我们先明白如何将原数求出。很显然,c[1]~c[i]差分数组求和即可得到a[i]。
那区间修改呢?
如我们将从l到r的区间加上s(减去也一样),那么由差分数组的定义得,观察数组,发现只有c[l]和c[r+1]变化了。
具体证明可以手动模拟,而中间的不变是因为i项与i-1项都加上了s,差值不变;
那么这样就能得到
$a[l]~a[r]+=s-->c[l]+s,c[r+1]+s$
这样就实现了O(1)修改;
当然还有区间求和,这里给出证明
这样我们可以发现一个规律,即第二个多项式的系数为i-1
那么我们用c2[ ]来维护这个数组,那么
c2[i]=(i-1)*c[i];
并且在修改时维护c2[ ]数组,即
$c[l]+(l-1)*s,c[r+1]-(r+1-1)*s$
之后便有了公式
这里便是一维差分
二维差分的推导
这里的推导只是单纯的根据一维差分和二维前缀和的性质来推的
二维前缀和请务必提前了解,并有一定的认识;
那么开始推导;
根据二维前缀和表示的是右上角矩形的和,由于差分只涉及前面相邻的数(由一维可以推出),并且由前面范围的数相加得到这个位置的数;
那么类比二维前缀和和一维差分,可以简单推测出二维差分的公式
$c[i][j]=a[i][j]-a[i-1][j]-a[i][j-1]+a[i-1][j-1]$
是不是觉得非常眼熟?
我们再代入检验,即将左上角的矩阵差分求和,正好得到了这个数·
这还并不能代表什么,重要的是区间的修改;
同样,我们将要修改的矩阵的右上角设为(x1,y1),右下角设为(x2,y2)
我们发现有影响的只有我所标注的点,除了(x2,y2),这个应该很好看出;
那么,我们就得到公式
$c[x1][y1]+=s,c[x1][y2+1]-=s,c[x2+1][y1]-=s,c[x2+1][y2+1]+=s$
推荐自己再推一遍。
之后求数只需累加即可。