树状数组的区间更新--差分数组

一、差分数组建数组原理:

树状数组(区间更新)//差分数组

令树状数组建树为

(设a是原始数组,tree是树状数组)

原理:

区间更新若要将区间[L,R]内每一点的值增加h

即a[L]+=h;a[L+1]+=h;a[R]+=h;

  1. 区间[1,L-1]的a值不变,所以tree的对应值也不变
  2. 因为a[L]+=h; a[L-1]不变
    tree[L]=a[L]-a[L-1];
    所以:tree[L]增大h
  3. 在i∈[L+1,R]内   
    tree[i]=a[i]-a[i-1];
    a[i]和a[i-1]都加了h,相减都减掉了
    所以:tree[i]不变
  4. 对于tree[R+1]=a[R+1]-a[R];
    a[R+1]不变,a[R]增大了h
    所以tree[R+1]减少了h

 

综上:区间更新时,只需要更新tree的两个点

 

二、多种求和方式转化:

求和:

对于tree数组的建立方式,可知

 a[i]=tree[1]+tree[2]+……+tree[i];

  1. 若是单点查询,即求tree的前缀和即可
  2. 若是区间[1,x]查询
    sum(x)=a[1]   +a[2]          +a[3]                  +…+a[x]
          =tree[1]+(tree[1]+tree[2])+ (tree[1]+tree[2]+tree[3])+…+(tree[1]+…+tree[x])
          =x*tree[1]+(x-1)*tree[2]+…+2*tree[x-1]+tree[x](因为每次都是变的,所以这样仍不能求)
          =x*(tree[1]+…+tree[x])-(tree[2]+2*tree[3]+…+(x-1)tree[x])
         
    =x*

要求上式,可以建2个树状数组,A[]B[]

sum=x*sum(A[x])-sum(B[x]);

(区间更新时)数组A是正常的添加值,数组B的添加值要乘上前面的系数(i-1)(结合树状数组求和方式再好好想想)

3.区间[L,R]的和的查询

  1. ans=a[L]+a[L+1]+…+a[R]     (这种简单)
       =sum(R)-sum(L)
  2. 令len=R-L+1;
    若求公式ans=len*a[L]+(len-1)*a[L+1]+…+a[R]
    则同上的转化方式 得:

(自己转化一下就可以了,树状数组不变)


 

对于区间【L,R】的查询(3)

<1>例题见https://blog.csdn.net/qq_37868325/article/details/81123044的J题

<2>的例题见https://blog.csdn.net/qq_37868325/article/details/82561477的H题。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值