用树状数组解决窗口的星星问题的代码
时间: 2024-05-10 09:16:06 浏览: 80
js用闭包遍历树状数组的方法
以下是用树状数组解决窗口的星星问题的代码:
```python
n, q = map(int, input().split())
bit = [[0] * (n+1) for _ in range(n+1)]
for i in range(q):
query = input().split()
if query[0] == 'add':
x, y, a = map(int, query[1:])
x += 1
y += 1
while x <= n:
y1 = y
while y1 <= n:
bit[x][y1] += a
y1 += y1 & -y1
x += x & -x
else:
l, b, r, t = map(int, query[1:])
l += 1
b += 1
r += 1
t += 1
ans = 0
x = l
while x > 0:
y = b
while y > 0:
ans += bit[x][y]
y -= y & -y
x -= x & -x
x = r
while x > 0:
y = b
while y > 0:
ans += bit[x][y]
y -= y & -y
x -= x & -x
x = l
while x > 0:
y = t
while y > 0:
ans += bit[x][y]
y -= y & -y
x -= x & -x
x = r
while x > 0:
y = t
while y > 0:
ans += bit[x][y]
y -= y & -y
x -= x & -x
print(ans)
```
其中,`n` 为二维平面的边长,`q` 为操作的总数。`bit` 数组为树状数组,用于维护二维平面上的星星数量。
对于每个 `add` 操作,我们需要将指定位置的星星数量加上给定的值。具体实现时,我们需要利用树状数组的特性,先将每个位置的星星数量都加上给定的值,然后再按照树状数组的更新方式更新每个位置的值。
对于每个 `query` 操作,我们需要计算指定窗口内的星星数量。具体实现时,我们需要利用树状数组的特性,分别计算出窗口左、右、上、下四个边界内的星星数量,然后将它们相加即可得到答案。
注意,在计算过程中,我们需要将所有坐标加一,这是因为树状数组要求下标从 1 开始。
阅读全文