给定大小为N * N的二维矩阵mat [] [] ,矩阵的所有元素最初均为0 。需要在矩阵上执行多个查询(M个范围),其中每个查询由四个整数X1 , Y1 , X2和Y2组成,任务是向mat [X1] [Y1]和mat之间的所有像元加1 [X2] [Y2] (包括两者)并最后打印更新后的矩阵的内容。
例子:
Input: N = 2, q[][] = { { 0, 0, 1, 1 }, { 0, 0, 0, 1 } }
Output:
2 2
1 1
After 1st query: mat[][] = { {1, 1}, {1, 1} }
After 2nd query: mat[][] = { {2, 2}, {1, 1} }
Input: N = 5, q[][] = { { 0, 0, 1, 2 }, { 1, 2, 3, 4 }, { 1, 4, 3, 4 } }
Output:
1 1 1 1 1
1 1 2 1 2
2 2 2 2 2
2 2 2 2 2
0 0 0 0 0
方法:对于每个查询, (X1,Y1)代表子矩阵的左上角单元格,而(X2,Y2)代表子矩阵的右下角单元格。对于每个左上小区添加1顶端左元素,并从下一个到右下单元中的元件(如果有的话)中减去1。
然后维护原始(现在已修改)矩阵中所有元素的运行总和,并且每次添加时,当前总和就是当前位置处的元素(已更新)。
下面是上述方法的实现:
C++
// C++ implementation of the approach
#include
using namespace std;
// Function to update and print the
// matrix after performing queries
void updateMatrix(int n, int q[3][4])
{
int i, j;
int mat[n][n];
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
mat[i][j] = 0;
for (i = 0; i < 3; i++)
{
int X1 = q[i][0];
int Y1 = q[i][1];
int X2 = q[i][2];
int Y2 = q[i][3];
// Add 1 to the first element of
// the sub-matrix
mat[X1][Y1]++;
// If there is an element after the
// last element of the sub-matrix
// then decrement it by 1
if (Y2 + 1 < n)
mat[X2][Y2 + 1]--;
else if (X2 + 1 < n)
mat[X2 + 1][0]--;
}
// Calculate the running sum
int sum = 0;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
sum += mat[i][j];
// Print the updated element
cout << sum << " ";
}
// Next line
cout << endl;
}
}
// Driver code
int main()
{
// Size of the matrix
int n = 5;
// Queries
int q[3][4] = {{ 0, 0, 1, 2 },
{ 1, 2, 3, 4 },
{ 1, 4, 3, 4 }};
updateMatrix(n, q);
return 0;
}
// This code is contributed by chandan_jnu
Java
// Java implementation of the approach
public class GFG {
// Function to update and print the matrix
// after performing queries
static void updateMatrix(int n, int q[][], int mat[][])
{
int i, j;
for (i = 0; i < q.length; i++) {
int X1 = q[i][0];
int Y1 = q[i][1];
int X2 = q[i][2];
int Y2 = q[i][3];
// Add 1 to the first element of the sub-matrix
mat[X1][Y1]++;
// If there is an element after the last element
// of the sub-matrix then decrement it by 1
if (Y2 + 1 < n)
mat[X2][Y2 + 1]--;
else if (X2 + 1 < n)
mat[X2 + 1][0]--;
}
// Calculate the running sum
int sum = 0;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
sum += mat[i][j];
// Print the updated element
System.out.print(sum + " ");
}
// Next line
System.out.println();
}
}
// Driver code
public static void main(String[] args)
{
// Size of the matrix
int n = 5;
int mat[][] = new int[n][n];
// Queries
int q[][] = { { 0, 0, 1, 2 },
{ 1, 2, 3, 4 },
{ 1, 4, 3, 4 } };
updateMatrix(n, q, mat);
}
}
C#
// C# implementation of the above approach
using System;
public class GFG {
// Function to update and print the matrix
// after performing queries
static void updateMatrix(int n, int [,]q, int [,]mat)
{
int i, j;
for (i = 0; i < q.GetLength(0); i++) {
int X1 = q[i,0];
int Y1 = q[i,1];
int X2 = q[i,2];
int Y2 = q[i,3];
// Add 1 to the first element of the sub-matrix
mat[X1,Y1]++;
// If there is an element after the last element
// of the sub-matrix then decrement it by 1
if (Y2 + 1 < n)
mat[X2,Y2 + 1]--;
else if (X2 + 1 < n)
mat[X2 + 1,0]--;
}
// Calculate the running sum
int sum = 0;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
sum += mat[i,j];
// Print the updated element
Console.Write(sum + " ");
}
// Next line
Console.WriteLine();
}
}
// Driver code
public static void Main()
{
// Size of the matrix
int n = 5;
int [,]mat = new int[n,n];
// Queries
int [,]q = { { 0, 0, 1, 2 },
{ 1, 2, 3, 4 },
{ 1, 4, 3, 4 } };
updateMatrix(n, q, mat);
}
// This code is contributed by Ryuga
}
Python3
# Python 3 implementation of the approach
# Function to update and print the matrix
# after performing queries
def updateMatrix(n, q, mat):
for i in range(0, len(q)):
X1 = q[i][0];
Y1 = q[i][1];
X2 = q[i][2];
Y2 = q[i][3];
# Add 1 to the first element of
# the sub-matrix
mat[X1][Y1] = mat[X1][Y1] + 1;
# If there is an element after the
# last element of the sub-matrix
# then decrement it by 1
if (Y2 + 1 < n):
mat[X2][Y2 + 1] = mat[X2][Y2 + 1] - 1;
elif (X2 + 1 < n):
mat[X2 + 1][0] = mat[X2 + 1][0] - 1;
# Calculate the running sum
sum = 0;
for i in range(0, n):
for j in range(0, n):
sum =sum + mat[i][j];
# Print the updated element
print(sum, end = ' ');
# Next line
print(" ");
# Driver code
# Size of the matrix
n = 5;
mat = [[0 for i in range(n)]
for i in range(n)];
# Queries
q = [[ 0, 0, 1, 2 ],
[ 1, 2, 3, 4 ],
[ 1, 4, 3, 4 ]];
updateMatrix(n, q, mat);
# This code is contributed
# by Shivi_Aggarwal
PHP
输出:
1 1 1 1 1
1 1 2 1 2
2 2 2 2 2
2 2 2 2 2
0 0 0 0 0