一维以及二维的差分的简述

  差分,也就是数与数之间的差值。拿一维差分来举例子,将差分设为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$

  推荐自己再推一遍。

  之后求数只需累加即可。

posted @ 2019-06-28 08:53  Mr_Leceue  阅读(1268)  评论(0编辑  收藏  举报