题解 | #【模板】二维差分#
【模板】二维差分
http://www.nowcoder.com/practice/50e1a93989df42efb0b1dec386fb4ccc
思路:创建一个DP数组,把每次操作修改的起始位置,修正的起始位置记录。利用前缀和把要修改位置填上修改值。最后把DP数组和原始列表相叠加。
while True:
try:
n, m, q = map(int, input().split())
l = []
dp = [[0 for i in range(m + 1)]for j in range(n + 1)] # dp数组保存操作数值(变动值),不直接作用到原始数据上
for i in range(n):
l.append(list(map(int, input().split())))
for j in range(q):
x1, y1, x2, y2,k = map(int, input().split())
dp[x1][y1] += k # 起始修改位置
if x2 < n:
dp[x2 + 1][y1] -= k # 对数组修正,使子矩阵外数据不受影响。子矩阵右边修正
if y2 < m:
dp[x1][y2 + 1] -= k # 对数组修正,使子矩阵外数据不受影响。子矩阵下边修正
if x2 < n and y2 < m:
dp[x2 + 1][y2 + 1] += k # 对数组修正,使子矩阵外数据不受影响。子矩阵you下修正(在减右和减下时,右下角方格减掉两次)
for i in range(1, n + 1):
for j in range(1, m + 1):
dp[i][j] += dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] # 利用前缀和把dp[i][j]转化成修改值
l[i - 1][j - 1] += dp[i][j] # 同时对原数组l[i - 1][j - 1]的值加上dp[i][j]
for i in l:
print(' '.join([str(k) for k in i]))
except:
break