hdu 5671 Matrix 标记。。。有点晕

Matrix

Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)


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
 
Source
思路:就是标记记录那行是原数组的那行,在原数组的那行加减就好;
代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<queue>
#include<algorithm>
#include<stack>
#include<cstring>
#include<vector>
#include<list>
#include<set>
#include<map>
using namespace std;
#define ll __int64
#define mod 1000000007
#define inf 999999999
//#pragma comment(linker, "/STACK:102400000,102400000")
ll a[1010][1010];
ll hang[1010],lie[1010],hangadd[1010],lieadd[1010];//不管你怎么换 ,都不可能把这行给拆了
int main()
{
    ll casee,i,t;
    scanf("%I64d",&casee);
    while(casee--)
    {
        ll n,m,q;
        memset(hangadd,0,sizeof(hangadd));
        memset(lieadd,0,sizeof(lieadd));
        scanf("%I64d%I64d%I64d",&n,&m,&q);
        for(i=1;i<=n;i++)
        for(t=1;t<=m;t++)
        {
            scanf("%I64d",&a[i][t]);
            hang[i]=i;
            lie[t]=t;
        }
        while(q--)
        {
            ll op,han,li;
            scanf("%I64d%I64d%I64d",&op,&han,&li);
            if(op==1)
            {
                swap(hang[han],hang[li]);
            }
            else if(op==2)
            {
                swap(lie[han],lie[li]);
            }
            else if(op==3)
            hangadd[hang[han]]+=li;
            else
            lieadd[lie[han]]+=li;
        }
        for(i=1;i<=n;i++)
        for(t=1;t<=m;t++)
        printf("%I64d%c",a[hang[i]][lie[t]]+hangadd[hang[i]]+lieadd[lie[t]],t==m?'
':' ');
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/jhz033/p/5427140.html