BestCoder Round #81 (div.2) Matrix

 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\n",s[i][j]);
57         }
58     }
59     return 0;
60 }
View Code

之前我算着时间肯定回超的,但我抱着试试态度,我提交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\n",ans);
50         }
51     }
52     return 0;
53 }
54                 
AC代码

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

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

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

复杂度O(q+mn)

posted on 2016-04-22 21:14  青春的梦想付诸行动  阅读(155)  评论(0)    收藏  举报

导航