# 树状数组模板
class TreeArr:
def __init__(self, n):
self.tree = [0] * n
# 将下标 i 上的数加一
# 也可以传入一个参数,给整个区间加上特定的数
def inc(self, i: int) -> None:
while i < len(self.tree):
self.tree[i] += 1
i += i & -i
# 如果用补码表示负数,就是对这个正数的二进制表示按位取反再加1
# i & -i等价于i & (~i + 1),获取最低位的1。
# 返回闭区间 [1, i] 的元素和
def sum(self, i: int) -> int:
res = 0
while i > 0:
res += self.tree[i]
i &= i - 1
# 等价于 i -= i & -1
# 与上文原理一致
return res
# 返回闭区间 [left, right] 的元素和
def query(self, left: int, right: int) -> int:
return self.sum(right) - self.sum(left - 1)
树状数组Python模板
最新推荐文章于 2024-06-07 20:33:59 发布