社区讨论

树状数组动态扩容

学术版参与者 3已保存回复 14

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
14 条
当前快照
1 份
快照标识符
@mkrqcuzv
此快照首次捕获于
2026/01/24 11:08
4 周前
此快照最后确认于
2026/01/24 18:28
4 周前
查看原帖
rt,写了个树状数组动态扩容
代码CPP
#include <vector>
#include <iostream>
template <class data = int>
class Binary_Index_Tree
{
private:
    std::vector<data> BIT;

public:
    void reset()
    {
        BIT.clear();
    }
    unsigned lowbit(const unsigned x) const
    {
        return x & (-x);
    }
    Binary_Index_Tree(int x = 0, data y = data())
    {
        BIT = std::vector<data>(x, y);
    }
    void kuorong(unsigned x)
    {
        if (x <= BIT.size())
            return;
        const auto old_size = BIT.size();
        BIT.resize(x);
        const auto new_size = BIT.size();
        for (unsigned i = old_size; i < new_size; i++)
        {
            if (i < 1)
                continue;
            for (unsigned zzz_1 = i - 1, zzz_2 = i - lowbit(i); zzz_1 > zzz_2; zzz_1 -= lowbit(zzz_1))
                BIT[i] += BIT[zzz_1];
        }
        return;
    }
    data query(int x)
    {
        kuorong(x + 1);
        data wer(0);
        for (; x > 0; x -= lowbit(x))
        {
            wer += BIT[x];
        }
        return wer;
    }
    void change(unsigned x, const data d)
    {
        kuorong(x + 1);
        for (; x != 0 && x < BIT.size(); x += lowbit(x))
        {
            BIT[x] += d;
        }
    }
};
Binary_Index_Tree<> e;
using namespace std;
signed main()
{
    int n, m;
    cin >> n >> m;
    e = Binary_Index_Tree(0);
    for (int i = 1, zzz; i <= n; i++)
    {
        cin >> zzz;
        e.change(i, zzz);
    }
    for (int opt, zzz1, zzz2, j = 1; j <= m; j++)
    {
        cin >> opt;
        switch (opt)
        {
        case 1:
            cin >> zzz1 >> zzz2;
            e.change(zzz1, zzz2);
            break;
        case 2:
            cin >> zzz1 >> zzz2;
            cout << e.query(zzz2) - e.query(zzz1 - 1) << endl;
            break;
        }
    }
    return 0;
}
想问还有没有优化的空间什么的

回复

14 条回复,欢迎继续交流。

正在加载回复...