树状数组!!!!!!!!

发明这个的人真的变态啊!!!!!!!!!!

一,概念

树状数组是一种基于二进制思想的数据结构,基本用途是维护序列的前缀和。

对于给定的序列a,设树状数组为c,则c[x]保存序列a的区间[x-lowbit(x)+1,x]中所有数的和

二,lowbit()操作

 作用:求一个数字二进制的第一个为1的位置和后面的0构成的数值

 操作:让这个数与它的相反数&,即:n&(-n)

原理:

三, 使用条件

基本操作(稍后会讲)

1,单点查询,求前缀和,a中区间[1,x]的所有数的和

2,修改某一个数的值

时间复杂度o(log n)

扩展操作

区间修改,单点查询,.区间查询,区间修改

四,树状数组

将一个整数用二进制分解

 将它分为每一个小的的区间

如图:

看来看去,感觉我刚开始卡的就是c的含义,理解了这个后再去看y总的视频,就很轻松了

1,c 的含义

cx表示以x为结尾,长度为2^k的区间和

也可以说:

c|x|维护的是序列a的区间[x-lowbit(x)+1,x]和

2,c 的值

c(x)=a(x)+c(x-1)+c(x-1-lowbit(x-1))+.....(一直到零为止)  

(就是先变为11111...,然后不断减去后面的二进制里面的1)

 3,子结点个数

每个c(x)的子结点个数是lowbit(x)的位数

这个很容易证明

假设有一个为10010的数,它的子节点可以为00001,10010‘

4,寻找父节点’

很明显,每个cx的直接父节点,都是该数字的最高位1的前一位变为1,剩下的都变为0.

例如:

 x=4时,4=0100,它的父节点为1000

而且这个父节点是唯一的,只能是这个形式

故求父节点为 x+lowbit(x)   

相当于让这个数从最低位开始,进一位

五,两大基本操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值