差分(總結 例題)

2021-09-17 00:10:52 字數 1087 閱讀 1815

首先,給出乙個問題:

給出n個數,再給出m個詢問,每個詢問給出l,r,x,要求你在l到r上每乙個值都加上x,而只給你o(n)的時間範圍,怎麼辦?

思考一下:

如果暴力,卡一下l和r,隨隨便便就是o(n^2)。

用線段樹或樹狀陣列搞一搞,抱歉,這個複雜度是o(mlogn)的,還是不行(雖然他們解決別的題目很nb)

差分,沒錯,就是標題,很高興o(n)+常數......

差分就是將數列中的每一項分別與前一項數做差,例如:

乙個序列1 2 5 4 7 3,差分後得到1 1 3 -1 3 -4 -3

這裡注意得到的差分序列第乙個數和原來的第乙個數一樣(相當於第乙個數減0)

差分序列最後比原序列多乙個數(相當於0減最後乙個數)

具體操作:

我們需要先另外開乙個專門差分的陣列(大小=題中的序列長度)

假如在3~8的區間上加上5,那我們在差分陣列中的3位置上加上乙個5(原因暫時不懂沒關係,用筆先跟著模擬),再在8+1的位置上減乙個5,如此操作完m次。

假如我們只有這一次操作,開始統計答案,運用前置和的思想,vis[i](差分)=vis[i-1]+vis[i].那麼你會發現(如果你模擬了的話),在3~8的區間上,你已經使差分陣列全部加上了5(推廣到所有m一起統計答案依舊正確)

再用o(n)的for把他們加到原序列之中去,輸出!

性質:

1、差分序列求字首和可得原序列

2、將原序列區間[l,r]中的元素全部+1,可以轉化操作為差分序列l處+1,r+1處-1

3、按照性質2得到,每次修改原序列乙個區間+1,那麼每次差分序列修改處增加的和減少的相同

差分及字首和基礎和例題總結

差分 字首和有著特殊的關係,也是一種入門演算法 首先考慮這樣乙個問題 有 n 個的正整數放到陣列 a 裡,現在要求乙個新的陣列 b,新陣列的第 i 個數 b i 是原陣列 a 第 0 到第 i 個數的和。字首和想必大家都知道,給定一陣列c i 用另外一陣列sum n 來儲存c 1 c n 的和,這樣...

差分總結二 樹上差分

找這個樹上 重複經過的最多點 經過幾次 看這名字 就醉了orz 這題是 樹上差分 模板題 點差分 點差分的話 由於 lca 本身是有貢獻的 那麼d lca 用d lca父親 只要消掉影響 include using namespace std const int maxn 1e5 10 int n,...

差分約束 總結

如果乙個系統由n個變數和m個約束條件組成,其中每個約束條件形如xj xi bk i,j 1,n k 1,m 則其為差分約束系統 system of difference constraints 亦即,差分約束系統是關於一組變數的特殊不等式組。求解差分約束系統,可以轉化成圖論的單源最短路徑問題。觀察x...