树状数组区间修改区间求和
时间: 2023-06-22 22:22:20 浏览: 92
算法NOIP树状数组校门外的树.pdf
树状数组可以用来维护区间修改区间求和的问题。具体的实现步骤如下:
1. 定义一个数组 bit,长度为 n+1,用来存储树状数组。
2. 定义两个函数:lowbit(x) 和 update(x, v)。
lowbit(x) 函数可以返回 x 的二进制表示中最低位的 1 所代表的值。
update(x, v) 函数可以将数组中下标为 x 的值加上 v。
具体实现如下:
```python
def lowbit(x):
return x & (-x)
def update(x, v):
while x <= n:
bit[x] += v
x += lowbit(x)
```
3. 定义两个函数:query(x) 和 query_range(l, r)。
query(x) 函数可以返回数组中前 x 个数的和。
query_range(l, r) 函数可以返回区间 [l, r] 中所有数的和。
具体实现如下:
```python
def query(x):
res = 0
while x > 0:
res += bit[x]
x -= lowbit(x)
return res
def query_range(l, r):
return query(r) - query(l-1)
```
4. 最后,根据需要调用 update 和 query_range 函数即可。
```python
# 初始化数组
n = 10
bit = [0] * (n+1)
# 修改数组中下标为 3 的数为 5
update(3, 5)
# 查询数组中前 6 个数的和
print(query(6))
# 查询区间 [2, 8] 中所有数的和
print(query_range(2, 8))
```
阅读全文