1. 程式人生 > 實用技巧 >字首和 和差分

字首和 和差分

字首和,又稱 和陣列,用於求解獲取某一部分連續區間的問題。

演算法實現:定義一個和陣列d,接著輸入過後,用和陣列中的第i個元素表示前i個數的和,遞推式:d[i]=d[i-1]+a[i],想要獲取其中從x 到y的連續元素和, 只需要使用o(1)公式d[y+1]-d[x]即可。

演算法原理:求和時 使用了簡單的容斥原理,如下圖所示

演算法比較:字首和:o(n),預處理加呼叫,係數=2 暴力演算法:o(nm),其中m是區間長度

原因:犧牲空間(多開了和陣列),節省時間,簡稱:預處理乾的多

----------------------------------------------------------------------------分割線-------------------------------------------------------------------------------

差分,又稱差分陣列,用於 對某一段連續區間中所有的元素進行批量處理,

演算法實現,首先填滿差分陣列,使用遞推式:d[i]=a[i]-a[i-1],接著對區間[x,y] 進行批量處理:d[x]-=do,d[y+1]+=do,用於對[x,y]進行-do操作,最後對差分陣列進行字首和

演算法原理:我們稱接受-do的所有元素擁有基因,並且如果後面一個元素也擁有基因, 就稱之為遺傳。我們 首先授予d[x]基因,那麼 在字首和的時候,基因就會 跟著字首和向後遺傳。為了讓基因 停歇在d[y]處,我們就在d[y]處將do加上,讓基因停止遺傳。

演算法比較:差分:o(n),預處理加呼叫,係數=2, 暴力演算法:o(nm),m是最大區間長度

原因:和字首和一樣,我們會發現,差分就是和陣列的“逆運算”

最後附上ppt:

題目多得很,自己搜一搜。

基本程式碼根據敘述自己寫一寫,如果寫的不容易懂,可以結合大佬們的部落格一起服用。