树状数组从零到一些拓展的学习笔记及模板

本文详细介绍了树状数组的概念,包括其如何将区间拆分为特殊子区间,C[i]的定义和求取,以及如何进行单点修改和快速更新。通过实例解释了树状数组的优势,如在单点修改和前缀和查询时的高效性。此外,还探讨了C[i]的更广泛定义,以及与差分的结合,展示了树状数组在处理区间操作和最值问题上的潜力。
摘要由CSDN通过智能技术生成

树状数组

为了表述方便,下面所有的数字,都是二进制形式下的。

拆分成特殊区间------C[i]的定义

树状数组通过特定将区间 [ 1 , i ] \left[1,i \right] [1,i]通过一个特殊地规则,将区间拆分成 k ( k ≤ log ⁡ 2 i + 1 ) k(k \leq \log_{2}{i+1}) k(klog2i+1)个区间 ( i k − 1 , i k ] , ( i k − 2 , i k − 1 ] , … , ( 0 , i 1 ] ] \left(i_{k-1},i_{k} \right], \left(i_{k-2},i_{k-1} \right],\dots,\left(0,i_1\right]] (ik1,ik],(ik2,ik1],,(0,i1]],其中 i k = i i_k=i ik=i.

而所谓特殊地规则,是这样的,首先将 ( l , r ] \left(l,r\right] (l,r],首先将 r r r用二进制表示,然后将最后一个1变成0即获得了左端点 l l l.
之后把 l l l作为下一个区间的右端点,重复进行,直到整个区间分完了。

举个例子。假设 r = 100011001001 r=100011001001 r=100011001001.划分的区间如下

l r
100011001000 100011001001
100011000000 100011001000
100010000000 100011000000
100000000000 100010000000
000000000000 100000000000

我们将数 i i i二进制表示形式下最后一个1的位权(即那个1及其后面的一连串的0表示的数)定义为 l o w b i t ( i ) lowbit(i) lowbit(i).那么上面拆分成的特殊区间 ( l , r ] \left(l,r\right] (l,r]拆分规则就可以用 l = r − l o w b i t ( r ) = r l o w b i t ( r ) l=r-lowbit(r)=r^lowbit(r) l=rlowbit(r)=rlowbit(r)表示了。

由位运算的知识不难推导出 l o w b i t ( x ) = x & ( − x ) lowbit(x)=x\&(-x) lowbit(x)=x&(x).

可以看到,区间的右端点每次变化的时候,都是去掉一个1.因此,拆分成的子区间数就是i二进制表示下1的个数。假设 i i i含有 k k k个1,而 k k k个1表示的最小数是 11 … 1 11\ldots1 111,即 2 k − 1 2^k-1 2k1,故 i ≥ 2 k − 1 i \geq 2^k-1 i2

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值