大家都知道普通的樹狀陣列的實現,
大致是這樣的:
節點k,統計的葉子範圍為:[k
−low
bit(
k)+1
,k]
而每乙個節點都只記錄左兒子的資訊,
我們能夠查詢的也就只是[1
,n] 的資訊。
通常使用樹狀陣列維護字首和,但有時也能用來做一些看似只有線段樹才能實現的功能。
我們用字首和維護每個位置的增加的值。
記s[
i]表示[i
,n] 位置上的數都增加s[
i]的值。
那麼如果對[l
,r] 增加d,就s[
l]+d
,s[r
+1]−
d 。
求和的話,設原陣列為
a ,那麼對[l
,r]求和,
答案就是:an
s=∑i
=lr(
a[i]
+(r−
i+1)
∗s[i
])=∑
i=lr
a[i]
+∑i=
lr(r
∗s[i
]−i∗
s[i]
+s[i
])=∑
i=lr
a[i]
+(r+
1)∑i
=lrs
[i]−
∑i=l
ri∗s
[i]
而現在上面的∑r
i=la
[i],
∑ri=
ls[i
],∑r
i=li
∗s[i
]都可以維護。
後面兩個由於都只有單點的修改,即可使用樹狀陣列。(i∗
s[i]
將要增加的值乘以i就行了)
下面再給出兩個公式:
i節點的左兒子編號為:i−
lowb
it(i
)2i節點的右兒子編號為:i+
lowb
it(i
)2有了這兩個公式,能夠很方便地得到乙個節點地左右兒子,
便可以類似線段樹地方式實現很多功能。
未完待續。。。
樹狀陣列1 樹狀陣列入門
仔細看一下,發現tree的每乙個節點的高度並不是隨意的,而是由它轉成二進位制之後末尾連續零的數量決定的,連續零的數量加1,就是高度,例如 3 11 零的數量為0,加1等於1,所以它的高度就是1 6 110 零的數量為1,加1等於2,所以它的高度就是2 8 1000 零的數量為3,加1等於4,所以它的...
樹狀陣列 瞎bb 樹狀陣列
樹狀陣列是乙個利用一維陣列和位運算組成的求解區間問題的高效資料結構,其構造如圖所示 首先,我們要用它解決單點修改 區間查詢的操作。根據這張圖我們建立乙個陣列bit,下標就是圖中顯示的十進位制數。bit i 就表示了圖中所示的一段區間的和,例如bit 6 sum 5,6 bit 4 sum 1,4 下...
樹狀陣列 二維樹狀陣列模板
樹狀陣列模板 int lowbit int x int add int x,int val int que int x 模板題 題解 include include include using namespace std int c 300000 rank 300000 int n int lowb...