基本上和教材里面的一样, 区别在于:
1. 将二维前缀和与二维差分写在了一起.
2. 记录下有物品的最大x坐标与最大y坐标, 二重循环的时候, 可以减少循环次数.
def get(i, j):
if i < 0 or j < 0:
return 0
else:
return A[i][j]
N, R = map(int, input().split())
A = [[0] * 5001 for _ in range(5001)]
x_max, y_max = 0, 0
for _ in range(N):
x, y, w = map(int, input().split())
A[x][y] += w
x_max = max(x_max, x)
y_max = max(y_max, y)
ans = 0
for i in range(x_max + 1):
for j in range(y_max + 1):
A[i][j] += get(i, j - 1) + get(i - 1, j) - get(i - 1, j - 1)
ans = max(ans, get(i, j) - get(i - R, j) - get(i, j - R) + get(i - R, j - R))
print(ans)