共计 513 个字符,预计需要花费 2 分钟才能阅读完成。
| 线段树 | 树状数组 | |
|---|---|---|
| 结构 | 二叉树 | 阉割了一些点 |
| 空间 | ||
| 时间 | ||
| 用途 | 维护区间信息(区间gcd,区间和,区间最大/小) | 维护具有 结合律 且 可差分 的信息,入加法、异或等。 树状数组能解决的问题是线段树能解决问题的子集。 |
| 性能 | 代码长,时间常数大。 | 代码短,时间常数小。 |
树状数组维护的是一个前缀区间
我们观察一个数
我们观察这个图:

可以发现每个数都分给了 1所在的二进制位,那么每个编号管理的数的数目就是
函数(提取x对应的低位2次幂)
int lowbit(int x){
return x & -x ;
}
加点
void add(int x,int k){
while(x<=n){
s[x] += k ;
x += lowbit(x) ;
}
}
查询
int querry(int x){
int t = 0 ;
while(x){
t += s[x] ;
x -= lowbit(x) ;
}
return t ;
}
参考链接
正文完
发表至: 数据结构
2024-10-21