树状数组的一些区间修改与区间询问的实现

原文链接http://www.cnblogs.com/zhouzhendong/p/8685578.html 

前置技能

  基础树状数组。不会的话自己百度。

  要求掌握树状数组的以下操作:

  • 熟悉树状数组原理以及用途。
  • 单点修改,区间查询。
  • 区间加,单点查询。

 

问题模型

  树状数组实现区间加和区间查询。

实现

  记

  $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$$

   于是前缀和随便弄几下就好了。

拓展

  我不知道拓展啥啊,欢迎dalao留言指导。

posted @ 2018-04-01 08:19  zzd233  阅读(399)  评论(0编辑  收藏  举报