hdoj5671 BestCoder Round #81 (div.2)

对于交换行、交换列的操作,分别记录当前状态下每一行、每一列是原始数组的哪一行、哪一列即可。

对每一行、每一列加一个数的操作,也可以两个数组分别记录。注意当交换行、列的同时,也要交换增量数组。

输出时通过索引找到原矩阵中的值,再加上行、列的增量。

复杂度O(q+mn)

#include<cstdio>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<math.h>
#include<queue>
#include<stdlib.h>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
using namespace std;
#define INF 0x3f3f3f3f
#define N 1010
int a[N][N];
int ans[N][N];

int xh[N],h[N];
int xl[N],l[N];

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int q,n,m;
        scanf("%d%d%d",&n,&m,&q);
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
                scanf("%d",&a[i][j]);
        }
        memset(xh,0,sizeof(xh));
        memset(xl,0,sizeof(xl));
        for(int i=1;i<=n;i++)
            h[i]=i;
        for(int i=1;i<=m;i++)
            l[i]=i;
        int k,x,y;
        for(int i=0;i<q;i++)
        {
            scanf("%d%d%d",&k,&x,&y);
            if(k==1)
            {
                int t=h[x];
                h[x]=h[y];
                h[y]=t;
            }
            else if(k==2)
            {
                int t=l[x];
                l[x]=l[y];
                l[y]=t;
            }
            else if(k==3)
            {
                xh[h[x]]+=y;
            }
            else if(k==4)
            {
                xl[l[x]]+=y;
            }
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                ans[i][j]=a[h[i]][l[j]]+xh[h[i]]+xl[l[j]];
            }
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                if(j!=1)
                    printf(" ");
                printf("%d",ans[i][j]);
            }
            printf("\n");
        }
    }
    return 0;
}
posted @ 2016-04-25 23:55  see_you_later  阅读(120)  评论(0编辑  收藏  举报