這多是我最後一次更新博客了呢數組
好久以前,我初學樹狀數組的時候感受很是的複雜、神奇、晦澀難懂。。。spa
果真仍是我太菜了。後來瞭解到線段樹的可刪減性,這二者就天然而然的聯繫在一塊兒了。blog
很顯然,對於一些區間操做的問題,線段樹有着絕對的優點,基本上只要是區間查詢之類的問題,那線段樹是沒跑了。博客
可是若是咱們要查詢的是前綴和這樣的東西的話,會不會感受線段樹中的一些東西是多餘的呢?io
這麼說可能有些很差理解,畫畫圖就好:im
上圖若是看不清楚,請在新標籤頁中打開。(藍色爲節點標號,紅色是區間端點)查詢
假設咱們查詢到位置 9 的前綴和,那麼答案就等於 2 號節點和 6 號節點的和。margin
這兩個節點有什麼奇怪的性質?img
顯然它們都是左孩子啊,那是否是全部的前綴和都是僅由左孩子節點構成的呢。di
再試一下,就會發現,都是這樣的。如何證實?
從根節點開始,答案有如下兩種狀況。
先看第二種狀況。。。那這根本沒有懸念吧,只有左孩子。
那再看第一種狀況,在左孩子中查找答案。那麼答案仍是分紅上面的三種狀況。
關鍵的就是來看第三種狀況,那在右孩子中的答案就變成了 mid 到查詢區間的右端點的和。
若是把左子樹看作一個總體的話,只有變成了上面的差前綴和的問題。也就是說若是在右孩子中存在一部分答案的話,就會已知按照上面的三種狀況劃分下去,直到出現了第二種狀況。
那第一種狀況也是如此,已知分下去,問題要麼直接變成第二種狀況,要麼先變成第三種狀況再變成第二種狀況。
並且觀察咱們的路徑,會發現對答案有貢獻的節點所有都是左端點。也就是說又斷電時能夠省略掉的。
以下圖。
這就是線段樹的可刪減性。
樹狀數組能解決的不正是前綴和的查詢嗎?那麼咱們再來看上面的圖,刪掉右孩子後,是否是變成了一個樹狀數組呢?
這就是二者之間的關係。