发明这个的人真的变态啊!!!!!!!!!!
一,概念
树状数组是一种基于二进制思想的数据结构,基本用途是维护序列的前缀和。
对于给定的序列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)
相当于让这个数从最低位开始,进一位