HDU 5671 Matrix 水题

Matrix

题目连接:

http://acm.hdu.edu.cn/showproblem.php?pid=5671

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

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

题意

有一个\(n\)\(m\)列的矩阵\((1 \leq n \leq 1000 ,1 \leq m \leq 1000 )\),在这个矩阵上进行$q $ \((1 \leq q \leq 100,000)\) 个操作:

1 x y: 交换矩阵\(M\)的第\(x\)行和第\(y\)\((1 \leq x,y \leq n)\);
2 x y: 交换矩阵\(M\)的第\(x\)列和第\(y\)\((1 \leq x,y \leq m)\);
3 x y: 对矩阵\(M\)的第\(x\)行的每一个数加上\(y(1 \leq x \leq n,1 \leq y \leq 10,000)\);
4 x y: 对矩阵\(M\)的第\(x\)列的每一个数加上\(y(1 \leq x \leq m,1 \leq y \leq 10,000)\);

题解:

其实这些操作看着麻烦

但是我们都去打个标记就好了

他对于每一行和每一列的操作是分开的,我们对于每一行和每一列打标记就行了。

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1005;
int l[maxn],r[maxn],l1[maxn],r1[maxn];
int a[maxn][maxn];
void solve()
{
    int n,m,q;
    scanf("%d%d%d",&n,&m,&q);
    for(int i=1;i<=n;i++)l1[i]=i,l[i]=0;
    for(int i=1;i<=m;i++)r1[i]=i,r[i]=0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            scanf("%d",&a[i][j]);
    for(int i=1;i<=q;i++)
    {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        if(a==1)swap(l1[b],l1[c]);
        if(a==2)swap(r1[b],r1[c]);
        if(a==3)l[l1[b]]+=c;
        if(a==4)r[r1[b]]+=c;
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(j==m)printf("%d",a[l1[i]][r1[j]]+l[l1[i]]+r[r1[j]]);
            else printf("%d ",a[l1[i]][r1[j]]+l[l1[i]]+r[r1[j]]);
        }
        printf("\n");
    }
}
int main()
{
    int t;scanf("%d",&t);
    while(t--)solve();
    return 0;
}
posted @ 2016-04-24 15:29  qscqesze  阅读(377)  评论(0编辑  收藏  举报