1. 程式人生 > >樹狀陣列的區間加以及區間詢問講解

樹狀陣列的區間加以及區間詢問講解

前置技能

  基礎樹狀陣列。不會的話自己百度Orz。

  要求掌握樹狀陣列的以下操作:

  • 熟悉樹狀陣列原理以及用途。
  • 單點修改,區間查詢。
  • 區間加,單點查詢。

 

問題模型

  樹狀陣列實現區間加和區間查詢。

實現

  記

  $A_i$為數列上面的第$i$個元素。

  $delta_i=A_i-A_{i-1}, (1\leq i\leq n)$。

  $exdel_i=delta_i\times i$

  拓展公式:

  $$A_i=\sum_{j=1}^{i}delta_j$$

  推導區間加

  $\Large Add(L,R,v)$

$$delta_L+=v$$

$$exdel_L+=v*L$$

$$delta_{R+1}-=v$$

$$exdel_{R+1}-=v*(R+1)$$

  (好像沒什麼用啊……看看後面的詢問推導)

  推導區間詢問

  $\Large query(L,R)$

$$ans=\sum_{i=L}^{R}\sum_{j=1}^{i}delta_j\\=\sum_{i=1}^{L}(R-L+1)\times delta_i+\sum_{i=L+1}^{R}(R-L+1-(i-L))\times delta_i\\=\sum_{i=1}^{L}(R-L+1)\times delta_i+\sum_{i=L+1}^{R}(R+1-i)\times delta_i\\=\sum_{i=1}^{L}(R-L+1)\times delta_i+\sum_{i=L+1}^{R}(R+1)\times delta_i-\sum_{i=L+1}^{R}exdel_i\\=\sum_{i=1}^{R}(R+1)\times delta_i-\sum_{i=1}^{L}L\times delta_i-\sum_{i=L+1}^{R}exdel_i$$

   於是字首和隨便弄幾下就好了。

拓展