📜  在 Q 查询给出的范围内将子矩阵增加 K 后的最终矩阵(1)

📅  最后修改于: 2023-12-03 15:23:16.856000             🧑  作者: Mango

在Q查询给出的范围内将子矩阵增加K后的最终矩阵

这是一个用于在矩阵中给定区域内增加一个常数K的程序。它适用于所有与矩阵相关的问题,例如像像素操作、图像处理等等。

程序的输入

程序需要输入以下内容:

  1. $n$、$m$:矩阵的行数和列数;
  2. $K$:要增加的常数;
  3. $Q$:要查询的区域数量;
  4. $Q_i$:每个查询区域的左上角坐标 $(x_1, y_1)$ 和右下角坐标 $(x_2, y_2)$。
程序的输出

程序将返回一个 $n$ 行 $m$ 列的矩阵,其中子矩阵 $(x_1, y_1) to (x_2, y_2)$ 内的每个元素都增加了 $K$。如果某些查询重叠,则其结果将被合并。

程序实现思路

程序的具体实现思路见下面的代码:

n, m = map(int, input().split())
matrix = [[0] * (m+1) for _ in range(n+1)]

Q = int(input())
for _ in range(Q):
    x1, y1, x2, y2, k = map(int, input().split())
    matrix[x1][y1] += k
    matrix[x1][y2+1] -= k
    matrix[x2+1][y1] -= k
    matrix[x2+1][y2+1] += k

# 计算矩阵前缀和
for i in range(1, n+1):
    for j in range(1, m+1):
        matrix[i][j] += matrix[i-1][j] + matrix[i][j-1] - matrix[i-1][j-1]

# 输出
for row in matrix[1:]:
    print(' '.join(str(x) for x in row[1:]))

程序首先输入 $n$、$m$、$K$ 和 $Q$,然后使用 $Q$ 次循环输入所有的查询区域,并将其存储在一个二维矩阵中。每个查询区域由其左上角坐标 $(x_1, y_1)$ 和右下角坐标 $(x_2, y_2)$ 以及要增加的常数 $K$ 组成。对于每个查询区域 $(x_1, y_1) to (x_2, y_2)$,程序将其在矩阵中添加四个值,如下所示:

matrix[x1][y1] += k
matrix[x1][y2+1] -= k
matrix[x2+1][y1] -= k
matrix[x2+1][y2+1] += k

其中,第一个语句为矩阵 $(x_1, y_1)$ 处原始值增加 $K$。第二个语句减少了第二行中所有右侧位置的值,使之恢复为原始值;第三个语句减少了第二列中所有下方位置的值,使之恢复为原始值;第四个语句增加了右下方所有位置的值,使之减少 $K$。

这些操作将会在内存中构建一个二维前缀和数组。最后,程序输出元素与查询区域相关的增量,并使用一组简单的双重循环计算了最终的矩阵。