[Algorithm] Binary Indexed Tree 树状数组模板

15 篇文章 0 订阅
本文档详细介绍了C++实现的树状数组(Binary Indexed Tree)模板,包括构造函数、区间查询和单点更新操作。树状数组是一种高效的数据结构,用于求解区间加法和查询等问题。代码中展示了如何初始化、更新和查询数据,以及lowBit函数的使用。此模板适用于需要快速更新和查询数据集的场景。
摘要由CSDN通过智能技术生成

一、摘要

这是我个人的树状数组模板记录,对于其他人可能没有借鉴意义。

二、代码

// 树状数组类
// 下标从1开始
class BinaryIndexedTree{
public:
	// 构造函数,初始化数据数组c_,大小为总数据个数+1
    BinaryIndexedTree(int n){
        c_.resize(n+1);
        fill(c_.begin(), c_.end(), 0);
    }

    // 区间查询,查询a[1,idx]范围内的数据和
    int query(int idx){
        if(idx>=c_.size()){
            return 0;
        }
        int ret = 0;
        int i = idx;
        while(i>0){
            ret += c_[i];
            i -= lowBit(i);
        }
        return ret;
    }
    // 单点更新,将a[idx]数据增加num
    // 但是也可以达到区间修改的效果,即在c_中,将[idx,last)都增加num
    void update(int idx, int num){
        if(idx>=c_.size()){
            return;
        }
        int i = idx;
        while(i<c_.size()){
            c_[i] += num;
            i += lowBit(i);
        }
    }
private:
	// lowBit函数
    int lowBit(int num){
        return num&(-num);
    }
    vector<int> c_;
};

三、注意事项

  • 树状数组得英文名字是Binary Indexed Tree;
  • 数组分为原始数据数组a[]和前缀和数组c_[],c_数组个数要比a数组多一个,因为c_从1开始计数;
  • lowbit(x)函数为return x&(-x);
  • update(idx,val)为将c_[idx,idx+lowbit(idx),…]增加val,即使a[]的后缀都增加val,更新下标时使用i+=lowbit(i)
  • query(idx)为求c_[idx,idx-lowbit(idx),…],即求a得前缀和。更新下标时使用i-=lowbit(i)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值