蓝桥备赛指南(9):树形数据结构之树状数组基础

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)中的特定实现。