目录
前言
平常打线段树是不是打得烦了?代码量长 ,难修改?
那就学学树状数组吧!
单点修改:树状数组 30 30 30 行,线段树 50 50 50 行
区间修改:树状数组 40 40 40 行,线段树 100 100 100 行
看到没有,这就是差距!
什么是树状数组?
树状数组又名二进制查找树,为什么呢?让我们来看一看吧。
(以下图片来自网络)
乍一看好像没什么头绪,刚才说了,树状数组又名二进制查找树,把它的编号转成二进制看看?
显然:
一
二
设当前编号末尾有 x x x 个0
那么这一个点就有 ( x + 2 ) (x+2) (x+2) 条边 (一条连向父亲)
( x + 1 ) (x+1) (x+1) 条边(除去连向父亲的边)所连向的值都要到当前这个个点(一般是累加)。
l o w b i t lowbit lowbit
现在再引入树状数组一个很重要的思想: l o w b i t lowbit lowbit
l o w b i t lowbit lowbit 有什么用呢?
我们可以通过 l o w b i t lowbit lowbit 来得到最后一个 1 1 1 (二进制下)在哪个地方(并不严谨)
举个栗子:
l o w b i t ( 6 ( 10 ) ) = 2 ( 10 ) lowbit(6_{(10)})=2_{(10)} lowbit(6(10))=2