差分,又名差分函式或差分運算,差分的結果反映了離散量之間的一種變化。
例如,我們有一段離散化序列:a[1],a[2],a[3]......a[n-1],a[n], 我們可以建立數列的每一項與前一項的差值陣列 c,
則有 c [1] = a[1] - a[0],當 i>=2 時有 c[i]=a[i]-a[i-1]。這樣我們就可以將一段序列的差值序列記錄下來。
先來看這樣的例子:
我們可以發現:
a[1] = c[1]
a[2]=c[1]+c[2]=a[1]+a[2]-a[1]=a[2]
我們可以發現原數列的第 i 項可以由差分陣列前 i 項和得到,也就是 差分陣列的字首和。
如果我們求原數列的前i項和,就是差分陣列的字首和的字首和。
列出公式有:
對一段區間 [ l ,r] 進行加 x 的操作該怎樣進行呢,我們知道 c 陣列儲存的是每一項與前一項的差值,一段區間全部加x,那麼區間內的差值應該保持不變,需要改變的只是兩個端點, 也就是 c[ l ] 和 c[ r+1]項。c[ l]比前一項多 x,所以有c[l ] += x,c[r]也增加x,其後一項 c[ r+1] 減少 x,則 c [r+1] -= x 。
因此我們在處理一段區間時可以直接對受影響的兩個值進行操作即可,簡單快速。
如上面的公式:單點和為差分陣列的字首和,區間和為差分陣列字首和的字首和。
這個大佬寫的很好,這裡不再過多贅述。
1、hdu1556--color the ball
2、poj--3263--tallest cow
3、[ noip2012提高 & 洛谷p1083] 借教室
4、二維差分:hdu-6514 monitor
關於這個題,有大佬寫的賊棒:
青山遮不住,畢竟東流去。 江晚正愁餘,山深問鷓鴣。
刀刃飛,誰可為我敵。衣袂舞,一笑常門寂,而幸相遇,風清月明。
致qdu美好的夜景。
差分陣列詳解
學習部落格 題目 來先看一道裸題,有n個數。m個操作,每一次操作,將x y區間的所有數增加z 最後有q個詢問,每一次詢問求出x y的區間和。思路 很明顯,直接用字首和無法快速滿足這個操作,所以我們就用到了差分陣列。設a陣列表示原始的陣列 設d i a i a i 1 1設f i f i 1 d i ...
演算法基礎 差分陣列詳解
smile,breathe and go slowly.引入問題 已知乙個陣列 a 10 初始值全部為1。如果要將範圍 1,5 之間的每乙個數字都加1,應當如何操作。最簡單直接的操作就是for迴圈了 for int i 1 i 5 i a i 但是如果資料範圍較大,以及操作次數比較多,用for迴圈時...
差分陣列是個啥?能幹啥?怎麼用?(差分詳解 例題)
差分陣列很明顯就是個陣列唄,本菜雞學的比較淺,先說一下我自己認識的差分陣列吧!先解釋一下什麼是 差分 差分其實就是資料之間的差,什麼資料的差呢?就是上面所給的原始陣列的相鄰元素之間的差值,我們令d i a i 1 a i 一遍for迴圈即可將差分陣列求出來。下面給你乙個栗子,給出乙個差分陣列先 其實...