树状数组的养成方法
现在的我,能成为你的女主角吗。——《路人女主的养成方法》
树状数组
树状数组的概念
树状数组(Binary Index Tree) 是一种时间复杂度为
树状数组巧妙地利用了二进制。例如
我们定义,二进制数最右边的一个
树状数组的食用
单点修改
我个人比较喜欢 1
2
3
4
5
6
7
8
9
10inline void add (int x, int k)
{
while (x <= n)
{
tree[x] += k;
x += lowbit (x);
}
return ;
}
也可以写成
1 | inline void add (int x, int k) |
求前缀和
这边也有
1
2
3
4
5
6
7
8
9
10
11inline int query (int x)
{
int ans = 0;
while (x != 0)
{
ans += tree[x];
x -= lowbit (x);
}
return ans;
}1
2
3
4
5
6
7
8inline int query (int x)
{
int ans = 0;
for (int i = x; i; i -= lowbit (i))
ans += tree[i];
return ans;
}
区间修改
特殊的是,当我们求
具体代码这里就不贴了,
1 | add (x, k); |
这种方法很巧妙,先给
那么当然也可以实现区间求和,就是利用前缀和优化上面“前
树状数组在单点查询和单点修改上还是可以挥发出很大作用的(指码量),但是更推荐线段树,毕竟树状数组能做的事情,线段树都能做。
二维偏序
这是树状数组的一个拓展,至于我为什么不开新的文章是因为我想不出题目了(泪)。
然后因为老板想先看状压