树状数组的模板实现

本文分享一下树状数组的实现,原理后面再说

#include <memory>
#include <vector>

template <typename T, typename Factor, typename Allocator = std::allocator<T>>
class BinaryIndexedTree {
public:
    BinaryIndexedTree(std::size_t size, const Factor& factor, const Allocator& allocator = Allocator())
        : size(size), tree(size + 1, T(), allocator), factor(factor) {}

    void update(std::size_t index, const T& value) {
        index++; // Convert 0-based index to 1-based index
        while (index <= size) {
            tree[index] = factor(tree[index], value);
            index += lowbit(index); // Move to next node
        }
    }

    T query(std::size_t index) const {
        index++; // Convert 0-based index to 1-based index
        T result = T();
        while (index > 0) {
            result = factor(result, tree[index]);
            index -= lowbit(index); // Move to parent node
        }
        return result;
    }

    T query(std::size_t first, std::size_t last) const {
        if (first > last || last >= size) {
            throw std::out_of_range("Invalid range");
        }
        return query(last) - query(first - 1);
    }

private:
    std::size_t size;
    std::vector<T, Allocator> tree;
    Factor factor;

    std::size_t lowbit(std::size_t n) const {
        return n & -n;
    }
};

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值