在算法竞赛中,树状数组(Fenwick Tree)因其简洁高效的特性被广泛使用。但传统实现需要预先确定数据范围并预分配空间,当值域达到1e18量级时,离散化预处理会带来诸多不便:需要离线处理、增加编码复杂度。
我们可以利用unordered_map的无序容器特性配合树状数组的跳跃特性,实现动态内存分配的树状数组,创建出一个1e18甚至更大的树状数组,可以省去离散化的步骤,同时无需离线
#define LL long long
unordered_map<LL, LL> tree;
const LL N = 1e18 + 10;
LL lowbit(LL x) {return x & -x;}
void add(LL x, LL v) {
while(x <= N) {
tree[x] += v;
x += lowbit(x);
}
}
LL sum(LL x) {
LL sum = 0;
while(x) {
sum += tree[x];
x -= lowbit(x);
}
return sum;
}✅ 优势:
⚠️ 注意事项:
下面是使用超大树状数组做的题
1D Country - AtCoder abc371\_d - Virtual Judge

推荐在以下场景使用该技巧: