1. 程式人生 > >樹狀陣列應用匯總 [全]

樹狀陣列應用匯總 [全]

1. 逆序對 : 樹狀陣列維護比當前小的個數 , 權值作為下標 , 需要離散化 , 也可以擴充套件到前後比自己大或小的個數

 

2. 二維偏序問題 : 一維排序 , 二維樹狀陣列 , 也是權值作為下標 , 在樹狀陣列中插入1表示出現 ,

以後可以輔助CDQ分治解決三維偏序

 

3. 維護區間第k大 , 方法1 : 二分答案 logn^2 , 不在贅述

方法2 : 將樹狀陣列二進位制拆分 , 然後如果答案小於k , 就加上當前區間大小

通常用於求中位數 , 或其他擴充套件  , 二分答案可以求出樹狀陣列中(權值為下標) 的最大最小

 

4. 區間修改 , 單點查詢的差分樹狀陣列 : l插 , r+1插 , 單點查就好

 

5. 區間修改 , 區間查詢 : d[i] 為差分陣列 , 將字首和轉化為 , 維護兩個樹狀陣列

 Sum(x)=(x+1)\sum^x_{i=1}d[i]-\sum ^x_{i=1}i*d[i]

 

6. 二維樹狀陣列 : x減一個lowbit , 再把y減到0 , 統計答案 , 恢復y , x再減 直到x減到0

 

7. 矩陣修改 , 矩陣求和 : 類似5 , 維護4個樹狀陣列 , 可以得到

Sum(x,y)=(x+1)(y+1)\sum ^x_{i=1} \sum ^y_{j=1}d[i][j]-(y+1)\sum ^x_{i=1} \sum ^y_{j=1}d[i][j]*i-(x+1)\sum ^x_{i=1} \sum ^y_{j=1}d[i][j]*j + \sum ^x_{i=1} \sum ^y_{j=1}d[i][j]*i*j 

 

8. 字首/字尾 最大值 : 用處較少 , 只能維護到最前面或最後面 , 不能維護區間

 

9. 多元素型別題 (詢問某種特殊的值在l到r中出現次數) :

修改變成刪除和插入 , 按特殊的值排序 , 同一塊特殊值按時間排序 ,

每一塊特殊值做一次 , 做完後清零  , 大大地節省空間