树状数组(Binary Indexed Tree,简称BIT)是一种用于高效处理数组范围查询和单点更新操作的数据结构。它解决了传统的线段树在处理范围查询时的低效问题,并且在某些情况下,比如查询和更新操作频繁的情况下,它比线段树更快。
树状数组的核心思想是将数组的每个位置i
表示为一个二进制数,然后用这个二进制数的最后一个1来确定它是哪个父节点的子节点。更具体地说,如果i
的二进制表示中最后一个1位于第k
位(从右往左数,起始位为0),那么i
就属于它的父节点
。
下面是树状数组的C++实现:
#include <iostream>
#include <vector>
// 树状数组类
class BinaryIndexedTree {
private:
int n; // 数组大小
std::vector<int> tree; // 树状数组
// lowbit函数,获取x的最后一个1的位置
int lowbit(int x) {
return x & -x;
}
public:
// 构造函数,初始化树状数组
BinaryIndexedTree(int size) : n(size), tree(size + 1, 0) {}
// 单点更新,将index位置的值增加delta
void update(int inde