HDOJ5671

1769 ワード

问题を书く时、最も恐れている1种の问题:题意の上で明らかにシミュレーションで、しかしそのデータ量の大きさによって见て、シミュレーションが终わって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?'
':' '); } return 0; }