HDU 5671 Matrix - dblank

HDU 5671 Matrix

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 (1n1000,1m1000).Then we perform q(1q100,000) operations:

1 x y: Swap row x and row y (1x,yn);

2 x y: Swap column x and column y (1x,ym);

3 x y: Add y to all elements in row x (1xn,1y10,000);

4 x y: Add y to all elements in column x (1xm,1y10,000);

 

Input

There are multiple test cases. The first line of input contains an integer T(1T20) indicating the number of test cases. For each test case:

The first line contains three integers nm and q.
The following n lines describe the matrix M.(1Mi,j10,000) for all (1in,1jm).
The following q lines contains three integers a(1a4)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 1

Hint

Recommand 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;  
}

 

相关文章

发表新评论