HDOJ5671
刷题的时候,最怕的一种题:题意上明明是模拟,但是根据其数据量大小去看,模拟完肯定TLE
这个题,给了一种解决方法:对所谓的模拟进行记录而不是动作,最终根据记录情况输出,而不是变换完毕之后输出
看完代码发现很简单,但是想写出这种思路转换的代码很难
a【i】表示位置上的行变换
b【i】表示位置上的列变换
c【i】表示数值上的行变换
d【i】表示数值上的列变换
变换公式很容易按照题解上说的就好
最终答案比较难考虑:行列位置变换与行列数值变化都考虑进来
#include<map>
#include<set>
#include<math.h>
#include<time.h>
#include<iostream>
#include<cstdio>
#include<queue>
#include<stack>
#include<stdio.h>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<cstdlib>
using namespace std;
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define ll rt<<1
#define rr rt<<1|1
#define LL long long
#define ULL unsigned long long
#define maxn 1050
#define maxnum 1000050
#define eps 1e-6
#define input freopen("input.txt","r",stdin)
#define output freopen("output.txt","w",stdout)
int num[maxn][maxn];
int a[maxn],b[maxn],c[maxn],d[maxn];
int t,n,m,q;
int main(){
//input;
int i,j,x,y;
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&n,&m,&q);
memset(c,0,sizeof(c));
memset(d,0,sizeof(d));
for(i=1;i<=n;i++) a[i]=i;
for(i=1;i<=m;i++) b[i]=i;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
scanf("%d",&num[i][j]);
while(q--){
scanf("%d%d%d",&i,&x,&y);
if (i==1) swap(a[x],a[y]);
else if (i==2) swap(b[x],b[y]);
else if (i==3) c[a[x]]+=y;
else d[b[x]]+=y;
}
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
printf("%d%c",num[a[i]][b[j]]+c[a[i]]+d[b[j]],j==m?'\n':' ');
}
return 0;
}