1. 程式人生 > 其它 >【學習筆記】權值線段樹

【學習筆記】權值線段樹

一. 權值線段樹

權值線段樹即一種線段樹,以序列的數值為下標。節點裡所統計的值為節點所對應的區間 \([l,r]\) 中,\([l,r]\) 這個值域中所有數的出現次數。

舉個例子,有一個長度為 \(10\) 的序列 {\(1,5,2,3,4,1,3,4,4,4\)}。

那麼統計每個數出現的次數。易知 \(1\) 出現了 \(2\) 次,\(2\) 出現了 \(1\) 次,\(3\) 出現了 \(2\) 次,\(4\)出現了 \(4\)次,\(5\) 出現了 \(1\) 次。

那麼我們可以建出一棵這樣的權值線段樹:

從網上搬的。節點中的數字代表節點對應區間中所有數的出現次數。

  • 每個葉子節點的值: 代表 這個值的出現次數

  • 非葉子節點的值:代表了某一個值域內,所有值出現次數的和

上面的權值線段樹中,\(6,7,8\) 並沒有出現,然而卻被建出。如果序列的數 \(a_i\) 的取值範圍是 \(w\),那麼我們的樹就需要 \(O(wlogw)\) 的空間。這對於大部分題都是無法忍受的。