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

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

一般的树状数组对于可减信息可以实现单点修改+区间查询,如果套用差分,可以实现区间修改+单点查询。

同时实现区间修改和查询的方法

设要维护的序列\(a\),差分数组\(d_i = a_i - a_{i-1}\)

要求\([1, x]\)区间的和:
\[\begin{aligned} query(x) &= \Sigma_{i=1}^x a_i \\&= \Sigma_{i=1}^x \Sigma_{j=1}^i d_i \\ &= \Sigma_{i=1}^x (x-i+1)d_i \end{aligned} \]

维护一个序列\(ds_i = (i-1)d_i\)

则和为\(n \Sigma_{i=1}^x d_i - \Sigma_{i=1}^xds_i\)

Code

#define lb(x) (x & (-x))
int d[N], ds[N];
int ask_a(int *a, int x){int ans = 0;for(;x ; x-=lb(x)) ans += a[x]; return ans;}
void upd_a(int *a, int x, int v){for(; x<=n; x+=lb(x)) a[x] += v;}
int ask(int x){return ((ll)ask_a(d, x) * x - ask_a(ds, x);}
void upd(int x, int v){upd_a(d, x, v); upd_a(ds, x, (ll)v * (x - 1));}

打一些题很方便,比线段树友好多了,常数也小

转载于:https://www.cnblogs.com/RiverHamster/p/BIT-seq-operation.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值