刷题的时候,最怕的一种题:题意上明明是模拟,但是根据其数据量大小去看,模拟完肯定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;
}