树状数组

本文介绍了一种高效的数据结构——树状数组,并详细解释了如何利用Lowbit技巧进行区间查询与更新操作,适用于频繁的区间求和及元素更新场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 树状数组引入:

给出一个数组A:A[1]~A[10000];

给出多个查询区间[L~R],求区间和;

     L  R

E1:  3 - 10000

E2:  5 - 9999

直接使用原数组时间复杂度肯定很高

引入前缀和

S[L]=A[1]+A[2]+…+A[L];

S[R]=A[1]+A[2]+...+A[R];

求区间和就好求了许多

E:A[L]~A[R]的和

= S[R]-S[L-1];

看起来挺好,用起来很是方便,可是它也有不太好的地方,如果有修改的话,每次修改就要把修改数及其之后的前缀和全部修改,那么针对需要修改的题来说这个效率又变得很低

 

 

X  

Lowbit

十进制

二进制

(末尾0个数)

子叶数

C[4]

10022^2

C[3]

01102^0

C[2]

01012^1

C[1]

00102^0

 

 

 

 

 

 

 

Lowbit:其实是求一个非负整数n在二进制表示下“最低位1和其后边0”构成的数值。

C[i]代表从A[i-2^x+1]+…+A[i]

Lowbit(x)

Return x&(-x);

求解 E:10101000  经过Lowbit计算之后得到00001000

(取反:一个数的二进制表示法下从左向右数遇到的第一个1和所有0保持不变,向右的其余数字一次取反)

(按位与运算:1&1=1   1&0=0   0&1=0   0&0=0 )

设n>0,n的第k位为1,0~k-1位都是0,取反之后1右边的数字取反,0到k位保持不变。按位与运算之后0到k位仍然不变

以上是关于Lowbit()函数的解释,关于求和和更新的函数贴个解析:

https://blog.youkuaiyun.com/qq_40938077/article/details/80424318

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值