树状数组 && 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成神之路

版权声明:
作者:感冒的梵高
链接:https://www.techfm.club/p/20257.html
来源:TechFM
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>