树状数组
前置知识
-
lowbit函数
lowbit(x) = x & (-x)
Q:这么简单的一个运算作用是什么呢?
A:首先我们知道任何一个正整数都有其二进制表示,负整数的二进制表示为:该数绝对值的二进制表示的反码+1。
例如,对于一个数-7,我们知道其绝对值的二进制表示为0111,那么我们就可以知道-7的二进制表示为1000+1=1001,那么此时7&(-7)的结结果就是0001。
同理我们可以通过任意给定的x得到其x&(-x)的值。这里我们展示1-8之间的lowbit计算结果。
数值x x对应二进制表示 -x对应二进制表示 x&(-x) 1 0001 1111 0001 2 0010 1110 0010 3 0011 1101 0001 4 0100 1100 0100 5 0101 1011 0001 6 0110 1010 0010 7 0111 1001 0001 8 1000 1000 1000 通过上表我们可以发现,x&(-x)的二进制表示中永远只存在一个1位,当然这个性质是由其运算规则得到的统一性质,对全体实数有效。且我们容易发现1所在的位置就是x的二进制表示中最末位的1的位置。
也就是说,如果x的二进制表示第一次出现1的位置为k位,那么lowbit(x)= 2 k 2^k 2k
-
前缀和
Q:前缀和是如何定义的?
A:不妨定义原数组为a,存在一个数组s,如果s与a之间满足如下关系,我们就称数组s为数组a的前缀和数组。
如果输入索引从0开始,那么
∀ x ∈ t h e r a n g e o f i n p u t , a r e r e l a t e d t o : s [ x + 1 ] = s [ x ] + a [ x ] \forall x\in \ the \ range \ of \ input,are\ related\ to:s[x + 1] = s[x] + a[x] ∀x∈ the range of input,are related to:<