Matrix
Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 477 Accepted Submission(s): 207
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) ;
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 .
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
2 3 4 2 1 2 3 4 2 3 4 5 3 4 5 6 1 1 2 3 1 10 2 2 2 1 10 10 1 1 1 2 2 1 2
Sample Output
12 13 14 15 1 2 3 4 3 4 5 6 1 10 10 1HintRecommand to use scanf and printf题意:给你几种操作,对矩阵进行一系列操作后,输出最后的矩阵。有4种操作:交换x,y列,交换x,y行,x行增加y,x列增加y。思路:对每行每列,记录它实际的行和列,还有增量。最后直接实际的位置加增量就好。#include<iostream> #include<algorithm> #include<cstdio> #include<queue> #include<map> #include<vector> #include<cstring> #include<cmath> using namespace std; typedef long long ll; const ll INF = 0x3f3f3f3f; const double pi = acos(-1.0); const ll N = 1e3 + 10; int mat[N][N]; ll ans[N][N]; struct node { int root; ll add; } line[N], cal[N]; int main() { int t; cin>>t; while(t--) { int n, m, q; scanf("%d%d%d", &n, &m, &q); for(int i = 0; i<n; i++) line[i].root = i, line[i].add = 0LL; for(int j = 0; j<m; j++) cal[j].root = j, cal[j].add =0LL; for(int i = 0; i<n; i++) for(int j = 0; j<m; j++) scanf("%d", &mat[i][j]); int x, y, a; while(q--) { scanf("%d%d%d", &a, &x, &y); --x; if(a == 1) { --y; swap(line[x], line[y]); } if(a == 2) { --y; swap(cal[x], cal[y]); } if(a == 3) { //--y; line[x].add+=y; } if(a == 4) { cal[x].add+=y; } } for(int i = 0; i<n; i++) for(int j = 0; j<m; j++) { ans[i][j] = mat[line[i].root][cal[j].root] + line[i].add + cal[j].add; } for(int i = 0; i<n; i++) { for(int j = 0; j<m; j++) { if(j == 0) printf("%I64d", ans[i][j]); else printf(" %I64d", ans[i][j]); } printf("\n"); } } return 0; }