1.引入
树状数组是一种支持 单点修改 和 区间查询 的,代码量小的数据结构。(我只看到了代码量小)
什么是「单点修改」和「区间查询」?
假设有这样一道题:
已知一个数列 a,你需要进行下面两种操作:
「单点修改」:给定 \(x, y\),将 \(a[x]\) 自增$ y$。
「区间查询」:给定 \(l, r\),求解 \(a[l \ldots r]\) 的和。
类似地,还有:「区间修改」、「单点查询」。它们分别的一个例子如下:
区间修改:给定 \(l, r, x,\)将 $a[l \ldots r] $中的每个数都分别自增 \(x\);
普通树状数组维护的信息及运算要满足 结合律 且 可差分,如加法(和)、乘法(积)、异或等。
结合律:$$(x \circ y) \circ z = x \circ (y \circ z)$$,其中 $$\circ$$ 是一个二元运算符。