树状数组

功能

单点修改 O(log(n))
区间查询 O(log(n))

实现

前置知识点 lowbit()运算

lowbit(x)运算:得到x二进制下最低位的1和剩余的0所构成的数
例如:lowbit(10)
4的二进制可以表示为1010,则lowbit(10) = 2;

代码实现:

int lowbit(int x){
	return x & -x;
}

树状数组实现原理

树状数组可以认为是前缀和数组的变形,是用树的结果来实现前缀和。
具体的构造方式如下图
在这里插入图片描述

  • 1. 每个叶子节点t[x]是以当前点x向前延伸长度为lowbit(x)的前缀和
  • 2. t[x]的父节点为t[x + lowbit(x)]
  • 3.树的深度为logn + 1

功能实现

修改一个结点的值add(x, k)

void add(int x, int k){
	for (int i = x; i <= n; i += lowbit(i))
		t[i] += k;
}

查找前缀和

查找下标从1到x的这x个数的和

int query(int x){
	int sum = 0;
	for (int i = x; i; i -= lowbit(i)
		sum += t[i];
	
	return sum;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值