树状数组和ST表

Binary index tree 用来解决动态前缀和问题的数据结构。

树状数组或者二叉索引树也称作Binary Indexed Tree,又叫做Fenwick树;它的查询和修改的时间复杂度都是log(n),空间复杂度则为O(n),这是因为树状数组通过将线性结构转化成树状结构,从而进行跳跃式扫描。通常使用在高效的计算数列的前缀和,区间和。

树状数组和ST表

C1 = A1

C2 = A1 + A2

C3 = A3

C4 = A1 + A2 + A3 + A4

C5 = A5

C6 = A5 + A6

C7 = A7

C8 = A1 + A2 + A3 + A4 + A5 + A6 + A7 + A8

...

C16 = A1 + A2 + A3 + A4 + A5 + A6 + A7 + A8 + A9 + A10 + A11 + A12 + A13 + A14 + A15 + A16、

1101 = 13我们要询问13这个位置的前缀和。依次减去1即可。

1101 d[13]      有2^0=1个数

1100 d[12]       有2^2=4个数

1000 d[8]         有2^3=8个数

将上述3个加起来即可完成。

 

lowbit()函数:

lowbit(int x)

{

   return x&(-x);

}