關於區間操作查詢(字首和與差分)
阿新 • • 發佈:2022-05-23
今天學了字首和和差分,為了避免我把它忘掉,我還是淺淺的記錄一下吧
首先需要知道什麼是字首和與差分:
字首和就是陣列中某元素之前(包括此元素)的所有元素的和
設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 消除影響
程式碼如下: