树状数组(BIT)/Fenwick树维护和查询前缀信息

在BIT中,B[x]维护的区间是[x-lowbit(x)+1,x]。

先说查询,要查询区间[1,x],首先查B[x]得到[x-lowbit(x)+1,x]的信息,然后执行y=x-lowbit(x),得到[y-lowbit(y)+1,x-lowbit(x)]的信息,一直执行减去lowbit的操作直到x归零再将所有区间合并,即可不重不漏地获得[1,x]区间。

然后是维护,首先肯定要维护B[x],然后这里说一个结论,除开B[x]其他包含x信息的区间对应的B数组下标,必然是将x的某一位0(设这个位为c位)变为1,然后c位的更高位不变,c位的更低位全变成0,下面说明:

假设y所代表的区间[y-lowbit(y)+1,y]包含x,那么意味着y-lowbit(y)<=x且y>=x。

如果c位的更高位由0变1,那么必然y-lowbit(y)>x,所以不行。

如果c位的更高位由1变0,那么必然y<x,所以不行。

如果c位的更低位有任何1,那么必然y-lowbit(y)>x,所以也不行。

上述位操作看着复杂,其实只要不停地执行x+=lowbit(x)就行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值