樹狀數組 推廣

大家都知道普通的樹狀數組的實現,
大致是這樣的:
這裏寫圖片描述
節點k,統計的葉子範圍爲:[klowbit(k)+1,k]
而每一個節點都只記錄左兒子的信息,
我們能夠查詢的也就只是[1,n] 的信息。
通常使用樹狀數組維護前綴和,但有時也能用來做一些看似只有線段樹才能實現的功能。

區間更新

我們用前綴和維護每個位置的增加的值。
S[i] 表示[i,n] 位置上的數都增加S[i] 的值。
那麼如果對[l,r] 增加d,就S[l]+d,S[r+1]d
求和的話,設原數組爲A ,那麼對[l,r] 求和,
答案就是:

Ans=i=lr(A[i]+(ri+1)S[i])=i=lrA[i]+i=lr(rS[i]iS[i]+S[i])=i=lrA[i]+(r+1)i=lrS[i]i=lriS[i]

而現在上面的ri=lA[i],ri=lS[i],ri=liS[i]都可以維護。
後面兩個由於都只有單點的修改,即可使用樹狀數組。(iS[i] 將要增加的值乘以i就行了)
下面再給出兩個公式:
i節點的左兒子編號爲:ilowbit(i)2
i節點的右兒子編號爲:i+lowbit(i)2
有了這兩個公式,能夠很方便地得到一個節點地左右兒子,
便可以類似線段樹地方式實現很多功能。
未完待續。。。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章