树状数组
什么是树状数组?
树状数组是类似线段树的一个数据结构,支持单点修改、查询,区间修改、查询等操作,当你用查分TLE时,你就可以用树状数组解决。
树状数组和线段树的区别
树状数组代码简单适合用于简单一点的题目,而线段树结构复杂,代码较长,用于难题更为方便。
树状数组的结构
树状数组形似二叉树,却不是树形结构,其本质在于它每一个节点的的父节点,不是根据当前节点编号/2或除以2-1来确定的(注:这是二叉树的性质),而是通过计算lowbit值来确定(下文会讲到含义及计算方法)。
元素个数为8的序列的树状数组结构呈现是这样的:
什么是lowbit
lowbit是树状数组中计算一个节点指向另外哪一个节点的函数。就如图1号节点指向的是2号节点是因为1的lowbit值为2,而6号节点指向8号节点是因为6的lowbit值为8.
lowbit如何计算
很简单,只需要计算一下x&-x就行了。
举个例子:6
6的二进制编码为1110,而它的反码(即-6的二进制)为1001,进行&运算得:1000,即8的二进制编码。
代码实现:
int lowbit(int x) {
return x & -x;
}