二維差分陣列和二維字首和的個人看法

2021-09-26 03:14:06 字數 2199 閱讀 4984

一維差分陣列和字首和都挺熟悉的,做題在打cf的時候做到了乙個看別人用二維差分陣列求字首和的題,驚呆了,於是來補了下這方面的知識。

在學習和理解二維的時候,我們拿一維來對比就行了,思想是類似的但是略有所不同。

設乙個二維陣列a[i][j] 那麼它的二維字首和即為從(i,j) 到原點(0,0) 所有數之和,或者說這個矩形的大小。字首和不是單用來求和的,而是在查詢某一段區間的值時,能有o(1) 的高效。那麼,怎麼用字首和求某個區間的值呢,畫個圖你就知道了。

那麼它的區間大小為ans=sum(x1,y1)-sum(x0,y1)-sum(x1,y0)+sum(x0,y0)

可是光求字首和是不夠的,當你需要對陣列進行操作修改時,遍歷每乙個元素複雜度很高,這個時候可以維護乙個差分陣列,對比一維的差分陣列,當對區間進行+x時,只需要在區間首位進行操作即可。

這裡需要重點注意的是,瀏覽了不少關於差分陣列的部落格,都明確表示了,差分陣列並不是真正的差分,不代表原陣列中哪兩個值的差分,只是用來記錄原陣列的變化,利用的是差分的思想,仔細想想確實如此。但是我個人認為,差分陣列其實可以看成a[i][j]-a[i-1][j]-a[i][j-1]+a[i-1][j-1] 的值,這樣理解起來就會容易許多。

首先從一維差分陣列的角度來說,差分就是與前乙個做差,對比到二維,我們也與前乙個做差,只不過重複了,所以我們再加上a[i-1][j-1]

其次,從資料上來看,差分陣列的值確實也符合這一規律

而且,差分和求字首和本身就是乙個緊密聯絡的過程,對差分求字首和和對字首和做差分都是原陣列,而且這一看法能很好的解釋與理解對差分陣列的操作。

sum[a]

[b]++

;//a,b 為左上角座標

sum[a]

[y +1]

--;// x,y 為右下角座標

sum[x +1]

[b]--

; sum[x +1]

[y +1]

++;

最後,放上昨天的cf d題 是我看到某個紅名大佬的**花了不少時間理解的,我認為就是二維差分字首和的思想,如果有不對的地方,還希望各位大佬指正。

codeforces round #578 (div. 2) d white lines

#include

using namespace std;

char arr[

2010][

2010];

int sum[

2010][

2010];

void

add(

int a,

int b,

int x,

int y)

intmain()

}if(a ==-1

)add(1

,1, n, n)

;else

if(b - a +

1<= k)

add(

max(

1, i - k +1)

,max(1

, b - k +1)

, i, a);}

for(j =

1; j <= n; j++)}

if(a ==-1

)add(1

,1, n, n)

;else

if(b - a +

1<= k)

add(

max(

1, b - k +1)

,max(1

, j - k +1)

, a, j);}

int r =0;

for(i =

1; i <= n; i++)}

printf

("%d\n"

, r)

;return0;

}

這裡憑個人的理解稍作解釋。先找到最上下左右的黑色,然後掃瞄每一行和列,第乙個if判斷為如果這一行全為白色,沒有黑色,那麼就對整個矩陣進行add操作。怎麼理解這裡的add操作呢,**中的sum陣列存的就是上文中的差分陣列,是 若在當前位置(i,j)以k長度刷白,則能有多少行列為全白 的差分。 試想,若一行全為白色,則對整個陣列中任意乙個點進行操作,那麼均可加1(這一行或者列)

第二個判斷同理,以當前位置為右下角,那麼左上角的矩陣中任意一點刷白都能覆蓋到當前行或者列,所以都可以add

地毯 二維差分和二維字首和

見 類似於一維差分,o 1 的時間複雜度。二維差分相關概念 均是搬運 當對乙個二維區間內的所有數做出全部加乙個數或者全部減乙個數的操作時,需要修改二維差分矩陣內的四個點。比如我想讓a x1 y1 和a x2 y2 兩對角頂點圍成的矩形區域內的所有點都加1,則我需要 讓a x1 y1 a x1 y2 ...

二維字首和

時間限制 1 sec 記憶體限制 128 mb 提交 155 解決 51 提交 狀態 討論版 命題人 admin 題目描述 一種新型的雷射炸彈,可以摧毀乙個邊長為r的正方形內的所有的目標。現在地圖上有n n 10000 個目標,用整數xi,yi 0 xi,yi 5000 表示目標在地圖上的位置,每個...

二維字首和

1 二維字首和 模板 二維字首和 模板題 acwing 796.子矩陣的和 s i,j 第i行j列格仔左上部分所有元素的和 1.以 x1,y1 為左上角,x2,y2 為右下角的子矩陣的和為 s x2 y2 s x1 1 y2 s x2 y1 1 s x1 1 y1 1 s x y s x y 1 s...