「学习笔记」树状数组
树状数组
操作
以下代码为树状数组最常用的几个操作
1.
function lowbit(x:longint):int64;
Begin
exit(x and (-x));
end;
2. 单点修改
procedure replace(x,y:int64);
Var i:int64;
Begin
i:=x;
interim[x]:=y;
while i<=n do
Begin
tree[i]:=y;
i:=i+lowbit(i);
end;
end;
3. 区间查询
function get_summation(x:longint):int64;
Var i:int64;
Begin
get_summation:=0;
i:=x;
while i>0 do
Begin
get_summation:=get_summation+tree[i];
i:=i-lowbit(i);
end;
exit(get_summation);
end;
4.区间极值
function get_maximum(x,y:int64):int64;
Var i:int64;
Begin
get_maximum:=0;
i:=y;
while i>=x do
Begin
get_maximum:=max(interim[i],get_maximum);
i:=i-1;
while i-lowbit(i)>=x do
Begin
get_maximum:=max(tree[i],get_maximum);
i:=i-lowbit(i);
end;
end;
exit(get_maximum);
end;
以及……
区间修改可以树上差分。
概念
树状数组与线段树相似,效率上要比线段树高,但适用性却不如线段树。
定义一个数组表示子树的叶子结点的权值之和,这样可以发现到:
经过观察可以得出
函数的意义是取为 的二进制表达式中最低位的1所对应的值
树状数组本就是对于二进制的理解&运用,利用 我们可以快速遍历整棵树。
于是乎,树状数组还可以解决各种关于区间の问题。

浙公网安备 33010602011771号