1. 程式人生 > 其它 >關於區間操作查詢(字首和與差分)

關於區間操作查詢(字首和與差分)

今天學了字首和和差分,為了避免我把它忘掉,我還是淺淺的記錄一下吧

首先需要知道什麼是字首和與差分:

 字首和就是陣列中某元素之前(包括此元素)的所有元素的和

設b[]為字首和陣列,a[]是原陣列。

對於一維陣列而言,某個元素的字首和就是從這個陣列的第0個元素到這個元素的所有元素之和。

即:

那麼就可以對區間求和產生更深刻的理解:

對於求出一個區間[l,r]的所有元素之和,我們就可以將首元素的字首和與末元素的前綴合相減。

程式碼如下:

 而對於二維陣列來說,每個元素的字首和b[x][y]就是從a[0][0]到a[x][y]之間所有元素的和

比如b[3][1],就可以如下圖的方法表示:

而如果我想給一個區間求和,就直接表示為:

即:

那我要是想給一個區間求和,就可以表示為:

     

程式碼如下:

關於差分,就是將當前元素與前一個元素相減。

比如給定一個數組a[n]={1,3,7,5,2},他的差分陣列就是d[n]={1,2,4,-2,-3}

他的應用有很多,比如:給定一個序列,m次訪問,每次輸入兩個一維坐x1,x2,並輸入一個數c,代表這個數列從第x1個數到第x2個數之間的元素都加c,最後輸出最新的序列。

對於這種題,先求出這個序列的差分陣列d,每次詢問讓[L,R]+V轉化為d[L]+V,d[R+1]-V ,最後再將新陣列求一次字首和即可。

 對於二維差分

 現在我要在左上角是 (x1,y1),右下角是 (x2,y2) 的矩形區間每個值都 +p

 那如果開始位置+p,那根據字首和的性質,那麼它影響的就是整個黃色部分(所有的求和都增加了),多影響了兩個藍色部分。所以在兩個藍色部分 -p 消除 +p 的影響,而兩個藍色部分重疊的綠色部分多了個 -p 的影響,所以綠色部分 +p 消除影響

 程式碼如下: