树状数组 3/26

树状数组

采用lowbit();//返回二进制的第一个1的位置的大小 如 lowbit(110)==10==2; 它代表第6个位置是保存原数组该位置前1个的和+本身

代码实现

#include<iostream>
#include<vector>
template<typename T>
class Treesum  //Treesum  不是数组下标 是第几个
{
private:
    std::vector<T> bit;
    int lowbit(int x) { return x & (-x); }
public:
    Treesum(std::vector<T>& val,int n):bit(n + 1, 0)
    {
        int i,j;
        n = val.size();
        for (i = 0; i < n; i += 1)
        {
            for (j = i+1; j <= n; j += lowbit(j))
            {
                bit[j] += val[i];
            }
        }
    }
    Treesum(T *val, int n) :bit(n + 1, 0)
    {
        int  i, j;
        for (i = 0; i < n; i += 1)
        {
            for (j = i+1; j <= n; j += lowbit(j))
            {
                bit[j] += val[i];
            }
        }
    }
    Treesum(int n) :bit(n + 1, 0) {}
    bool update(int index, int delta)   //index不是数组下标 是第几个
    {
        int n = bit.size();
        if (index<1 || index>n)return false;
        for (; index <= n; index += lowbit(index))
            bit[index] += delta;
        return true;
    }
    T query(int n)     //前n项和
    {
        T sum = 0;
        while (n) { sum += bit[n]; n -= lowbit(n); }
        return sum;
    }
};
​
​
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值