树状数组 && P3374
本题就用树状数组来做了,不用线段树。
什么是树状数组? 树状数组是一个查询和修改复杂度都为O(logn)的数据结构。主要用于数组的单点修改和区间求和
(个人感觉树状数组写起来可能比线段树简单一点,其实也差不多,但是凡是用树状数组可以解决的问题,就一定可以用线段树解决)
树状数组每个结点的信息要覆盖自身编号和所有子节点包含的信息
lowbit函数来求解x最低位的1
int lowbit(int k){
return k & (-k);
}
(csdn上找的图片)
我们能看到:
更新过程是每次加了个二进制的低位1(101+1 ->110, 110 + 10 -> 1000, 1000 + 1000 -> 10000)
查询过程每次就是去掉了二进制中的低位1(1111 - 1 -> 1110, 1110 - 10 -> 1100, 1100 - 100 -> 1000)
单点更新:
如果我们要更新A[5]
lowbit(5) = 001 1 + 101 = 6(110)
lowbit(6) = 01
树状数组 && P3374最先出现在Python成神之路。
共有 0 条评论