社区讨论
树状数组动态扩容
学术版参与者 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 条回复,欢迎继续交流。
正在加载回复...