
1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 5 int s[1001][1001]; 6 7 int main() 8 { 9 int t,m,n,q,a,x,y; 10 scanf("%d",&t); 11 while(t--) 12 { 13 scanf("%d%d%d",&n,&m,&q); 14 for(int i=0;i<n;i++) 15 for(int j=0;j<m;j++) 16 scanf("%d",&s[i][j]); 17 while(q--) 18 { 19 scanf("%d%d%d",&a,&x,&y); 20 if(a==1) 21 { 22 int t; 23 for(int i=0;i<m;i++) 24 { 25 t=s[x-1][i]; s[x-1][i]=s[y-1][i]; s[y-1][i]=t; 26 } 27 } 28 if(a==2) 29 { 30 int t; 31 for(int i=0;i<n;i++) 32 { 33 t=s[i][x-1]; s[i][x-1]=s[i][y-1]; s[i][y-1] 34 35 =t; 36 } 37 } 38 if(a==3) 39 { 40 for(int i=0;i<m;i++) 41 s[x-1][i]+=y; 42 } 43 if(a==4) 44 { 45 for(int i=0;i<n;i++) 46 s[i][x-1]+=y; 47 } 48 } 49 int i,j; 50 for(i=0;i<n;i++) 51 { 52 for(j=0;j<m-1;j++) 53 { 54 printf("%d ",s[i][j]); 55 } 56 printf("%d ",s[i][j]); 57 } 58 } 59 return 0; 60 }
之前我算着时间肯定回超的,但我抱着试试态度,我提交ac,到了结束有显示超时,哎呀我去,看了下题解又做了一遍。

1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 7 const int MAX=1001; 8 int arr[MAX][MAX]; 9 int h[MAX],l[MAX];//h表示换行后的位置,l代表换列后的位置 10 int r[MAX],lr[MAX];//r表示第i行的之后加上的数,lr表示第i列之后加上的数 11 12 int main() 13 { 14 int n,m,t,q,a,x,y; 15 scanf("%d",&t); 16 while(t--) 17 { 18 for(int i=1;i<=1000;i++) 19 { 20 h[i]=i; l[i]=i; 21 } 22 memset(r,0,sizeof(r)); 23 memset(lr,0,sizeof(lr)); 24 scanf("%d%d%d",&n,&m,&q); 25 for(int i=1;i<=n;i++) 26 for(int j=1;j<=m;j++) 27 scanf("%d",arr[i]+j); 28 while(q--) 29 { 30 scanf("%d%d%d",&a,&x,&y); 31 if(a==1) 32 swap(h[x],h[y]); 33 if(a==2) 34 swap(l[x],l[y]); 35 if(a==3) 36 r[h[x]]+=y; 37 if(a==4) 38 lr[l[x]]+=y; 39 } 40 int i,j,ans; 41 for(i=1;i<=n;i++) 42 { 43 for(j=1;j<m;j++) 44 { 45 ans=arr[h[i]][l[j]]+r[h[i]]+lr[l[j]]; 46 printf("%d ",ans); 47 } 48 ans=arr[h[i]][l[j]]+r[h[i]]+lr[l[j]]; 49 printf("%d ",ans); 50 } 51 } 52 return 0; 53 } 54
对于交换行、交换列的操作,分别记录当前状态下每一行、每一列是原始数组的哪一行、哪一列即可。
对每一行、每一列加一个数的操作,也可以两个数组分别记录。注意当交换行、列的同时,也要交换增量数组。
输出时通过索引找到原矩阵中的值,再加上行、列的增量。
复杂度O(q+mn)