差分,也就是數與數之間的差值。拿一維差分來舉例子,將差分設為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$
推薦自己再推一遍。
之后求數只需累加即可。