Fenwick树,俗称树状数组
也就是二叉索引树(Binary Indexed Tree,BIT)
它的作用是什么呢
支持快速区间信息的维护和查询
为什么说是快速,因为它真的很快
O(nlog n)预处理
O(log n)维护和更新
先来看一个问题
给定一个n个元素的数组A
我们进行下面两个操作
1 add(x,d): 让A[x]增加d
2 query(l,r): 计算A[l]+A[l+1]+…+A[r]
怎么办
计算前缀和S,这可以在O(1)的时间解决query。但一旦进行add之后前缀后要重新算过。
不难发现如果进行add(x,d),对前面的前缀和是没有影响的,所以只要更新x之后的就好了
但其实还是不行,以为每次更新的花费还是很大
为什么花费会大
因为一个S的信息存储太大了,所以我们改小一点
但也不能太小,否则和直接算就一样了
所以我们用一个新的东西来存
下面来看一个图
注意到这里的C和我们之前的S很像
那我们就这样处理
用C来记一个和,但不是前缀和,而是类似与前缀和
仔细看这个图,如果我们要求前缀和,从C一直向右走,