树状数组区间修改区间查询

树状数组区间修改区间查询

问题——两种操作

  1. 给定 l,r,x ,将 [l,r] 这个区间内的所有值都加上 x
  2. 给定 l,r 求出 [l,r] 的区间和

这道题肯定要用前缀和和差分,那么大体框架可以出来了

//操作一: update(l, x), update(r + 1, -x); //操作二 query(r) - query(l - 1)

那么怎么将这两个东西串在一起呢?

a 为原数组,sum 为前缀和数组,则:

sumk=i=1kai

再设 b 为差分数组,根据定义,易得:

ak=i=1kbi

放在一起可以得到:

sumk=i=1kj=1ibj

可以发现 b1 被使用了 k 次, b2 被使用了 k1 次,可以发现,对于 sumk , bi 被用了 ki+1 次,所以可以把原式转化成:

sumk=i=1kbi×(ki+1)

由于 k+1 对原来的式子没有任何影响,可以提取出来,这样再转化得

sumk=(k+1)i=1kbii=1kbi×i

这样我们只要分别维护 bibi×i 的前缀和就可以了

对于 update

void update(int x, int k) { for(int i = x; i <= n; i += lowbit(i)) tr1[i] += k, tr2[i] += k * x; }

对于 query

ll query(int x) { ll ans = 0; for(int i = x; i; i -= lowbit(i)) ans += tr1[i] * (x + 1) - tr2[i]; return ans; }

__EOF__

本文作者ljfyyds
本文链接https://www.cnblogs.com/ljfyyds/p/18014597.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   ljfyyds  阅读(61)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示