Lowbit操作
在学习树状数组之前,我们需要了解Lowbit操作,这是一种位运算操作,用于计算出数字的二进制表达中的最低位的1以及后面的所有0。
写法:(这是利用了计算机存储整数的特性来写的,在计算机中整除都使用补码进行存储。
int lowbit(int x) {
return x & -x;
}
树状数组
树状数组是一种可以“动态求区间和”的树形数据结构,但并没有真正地构造出来,所以是梳状的。基础的树状数组可以实现对区间的单点修改和区间查询,时间复杂度均为O(log n)。
模板
//给a[k]增加x
void update(int k, int x) {
for (int i = k; i <= n; i += lowbit(i)) {
t[i] += x;
}
}
//返回区间[1,k]的总和
int getprefix(int k) {
int res = 0;
for (int i = k; i > 0; i -= lowbit(i)) {
res += t[i];
}
}
拓展:
update()函数
在 C++ 中,update()
函数并不是标准库的一部分,但它在许多框架或自定义类中广泛用于更新数据、状态或界面。
getprefix()函数
在 C++ 中,getprefix()
并不是标准库函数,但它可能是用户自定义函数或某些框架/库(如 Boost)中的特定实现。