传送门
|
MatrixTime Limit: 3000/1500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 311 Accepted Submission(s): 142
Problem Description
There is a matrix
M that has
n rows and
m columns
(1≤n≤1000,1≤m≤1000) .Then we perform
q(1≤q≤100,000) operations:
1 x y: Swap row x and row y (1≤x,y≤n) ; 2 x y: Swap column x and column y (1≤x,y≤m) ; 3 x y: Add y to all elements in row x (1≤x≤n,1≤y≤10,000) ; 4 x y: Add y to all elements in column x (1≤x≤m,1≤y≤10,000) ;
Input
There are multiple test cases. The first line of input contains an integer
T(1≤T≤20) indicating the number of test cases. For each test case:
The first line contains three integers n , m and q . The following n lines describe the matrix M. (1≤Mi,j≤10,000) for all (1≤i≤n,1≤j≤m) . The following q lines contains three integers a(1≤a≤4) , x and y .
Output
For each test case, output the matrix
M after all
q operations.
Sample Input
Sample Output
Source
BestCoder Round #81 (div.2)
|
有一个n行m列的矩阵(1≤n≤1000,1≤m≤1000),在这个矩阵上进行q (1≤q≤100,000) 个操作: 1 x y: 交换矩阵M的第x行和第y行(1≤x,y≤n); 2 x y: 交换矩阵M的第x列和第y列(1≤x,y≤m); 3 x y: 对矩阵M的第x行的每一个数加上y(1≤x≤n,1≤y≤10,000); 4 x y: 对矩阵M的第x列的每一个数加上y(1≤x≤m,1≤y≤10,000);
输入包含多组数据. 第一行有一个整数T(1≤T≤15), 表示测试数据的组数. 对于每组数据: 第一行输入3个整数n, m, q. 接下来的n行,每行包括m个整数,表示矩阵M。(1≤Mi,j≤10,000),(1≤i≤n,1≤j≤m). 最后q行,每行输入三个整数a(1≤a≤4), x, y。
对于每组数据,输出经过所有q个操作以后的矩阵M。解题思路:
对于交换行、交换列的操作,分别用两个列数组和行数组记录当前状态下每一行、每一列是原始数组的哪一行、哪一列即可。对每一行、每一列加一个数的操作,也可以两个数组分别记录。注意当交换行、列的同时,也要交换增量数组。输出时通过索引找到原矩阵中的值,再加上行、列的增量。复杂度O(q+mn),注意一下输出的时候最后一列后边没有空格(我就被这个坑了)。。。
My Code:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAXN = 1000+5; typedef long long LL; int arr[MAXN][MAXN]; int h[MAXN],l[MAXN];///h:行,l:列 int r[MAXN],c[MAXN]; int main() { int n, m, T, q; scanf("%d",&T); while(T--) { scanf("%d%d%d",&m,&n,&q); for(int i=1; i<=m; i++) h[i] = i; for(int i=1; i<=n; i++) l[i] = i; for(int i=1; i<=m; i++) for(int j=1; j<=n; j++) scanf("%d",&arr[i][j]); memset(r, 0, sizeof(r)); memset(c, 0, sizeof(c)); while(q--) { int x, y, num; scanf("%d%d%d",&num,&x,&y); if(num == 1) swap(h[x],h[y]); else if(num == 2) swap(l[x],l[y]); else if(num == 3) r[h[x]] += y; else if(num == 4) c[l[x]] += y; } for(int i=1; i<=m; i++) { for(int j=1; j<n; j++) { int ans = arr[h[i]][l[j]] + r[h[i]] + c[l[j]]; printf("%d ",ans); } printf("%d\n",arr[h[i]][l[n]] + r[h[i]] + c[l[n]]); } } return 0; }