树状数组本质上就是用一个元素管理原数组中的多个元素,以快速求出某范围内元素的某些性质。
维护一个数组 fenwick
,下标从1开始。该数组的第 i
位元素代表原数组某几个连续元素的和。具体是哪几位元素呢:
若 i=6
,二进制表示为 0b110
,最低的 1
在倒数第二位,则其管理 101, 110
。若 i=0b1100
,则管理 1001, 1010, 1011, 1100
。
可以利用其求数组每个元素左侧有多少个小于它的元素。树状数组代表值域,从左到右遍历数组,每遇到一个数则将以该数为下标的树状数组的元素的值加一。假设当前遍历到了7这个元素:
0 1 2 3 4 5 6 7 8 9
0 0 0 1 1 0 0 1 0 0
如上图,那么元素7的左边有两个小于它的元素。
另外树状数组不一定要存储元素的和,也可以存储其他信息,例如最大值,最小值等,具体看题目要求。