Find the weight at (Xi, Yi) after M operations in a Matrix

• Difficulty Level : Hard
• Last Updated : 12 Dec, 2019

Given n x n points on cartesian plane, the task is to find the weight at (xi, yj) after m operation. xi, yj, w denotes the operation of adding weight w at all the points on the lines x = xi and y = yj.

Examples:

Input: n = 3, m = 2
0 0 1
1 1 2
x = 1, y = 0
Output: 3
Explanation: Initially, weights are
0 0 0
0 0 0
0 0 0
After 1st operation
2 1 1
1 0 0
1 0 0
After 2nd operation
2 3 1
3 4 2
1 0 0
Clearly, weight at (x1, y0) is 3

Input: n = 2, m = 2
0 1 1
1 0 2
x = 1, y = 1
Output: 3

Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Naive Approach:
Consider a 2-d array arr[n][n] = {0} and perform the given operations and then, retrieve the weight at (xi, yj). This approach will take O(n*m) time.

Efficient Approach:

• Consider the arrays arrX[n] = arrY[n] = {0}.
• Redefine the operation xi, yj, w as
arrX[i] += w
and
arrY[j] += w

• Find weight at (xi, yj) using
w = arrX[i] + arrY[j]

Below is the implementation of the above approach:

C++

 // C++ program to find the// weight at xi and yi  #include using namespace std;  // Function to calculate weight at (xFind, yFind)int findWeight(vector >& operations,               int n, int m,               int xFind, int yFind){    int row[n] = { 0 };    int col[n] = { 0 };      // Loop to perform operations    for (int i = 0; i < m; i++) {          // Updating row        row[operations[i]]            += operations[i];          // Updating column        col[operations[i]]            += operations[i];    }      // Find weight at (xi, yj) using    // w = arrX[i] + arrY[j]    int result = row[xFind] + col[yFind];      return result;}  // Driver codeint main(){    vector > operations        = {            { 0, 0, 1 },            { 1, 1, 2 }          };    int n = 3,        m = operations.size(),        xFind = 1,        yFind = 0;    cout << findWeight(operations,                       n, m, xFind,                       yFind);    return 0;}

Python3

 # Python3 program to find the# weight at xi and yi  # Function to calculate weight at (xFind, yFind)def findWeight(operations, n, m, xFind, yFind) :      row = [ 0 ] * n    col = [ 0 ] * n       # Loop to perform operations    for i in range(m) :           # Updating row        row[operations[i]]+= operations[i]           # Updating column        col[operations[i]]+= operations[i]       # Find weight at (xi, yj) using    # w = arrX[i] + arrY[j]    result = row[xFind] + col[yFind]       return result   # Driver codeoperations = [[ 0, 0, 1 ],[ 1, 1, 2 ]]n = 2m = len(operations)xFind = 1yFind = 0print(findWeight(operations,n, m, xFind, yFind))  # This code is contributed by divyamohan123

Output:
3

Time Complexity: where m is the number of operations

My Personal Notes arrow_drop_up