【链表】【模拟】Codeforces 706E Working routine

题目链接:

  http://codeforces.com/problemset/problem/706/E

题目大意:

  给一个N*M的矩阵,Q个操作,每次把两个同样大小的子矩阵交换,子矩阵左上角坐标分别为(a,b)和(c,d),高度h,宽度w。

  (2 ≤ n, m ≤ 1000, 1 ≤ q ≤ 10 000)

题目思路:

  【链表】【模拟】

  这一看如果直接模拟的话时间复杂度是N*M*Q,肯定T了。

  把矩阵看成链表,链表的方向有上下左右四种,其实每次交换两个子矩阵只改变的外围一圈的链表值,而内部的链接是没有变的,所以可以按照链表做。

  每次交换的时候,把子矩阵的最上、下、左、右的边的相应需要改变的链表值和另一个矩阵交换,这样就把两维问题转化为一维。

 

 

  1 //
  2 //by coolxxx
  3 //#include<bits/stdc++.h>
  4 #include<iostream>
  5 #include<algorithm>
  6 #include<string>
  7 #include<iomanip>
  8 #include<map>
  9 #include<memory.h>
 10 #include<time.h>
 11 #include<stdio.h>
 12 #include<stdlib.h>
 13 #include<string.h>
 14 //#include<stdbool.h>
 15 #include<math.h>
 16 #define min(a,b) ((a)<(b)?(a):(b))
 17 #define max(a,b) ((a)>(b)?(a):(b))
 18 #define abs(a) ((a)>0?(a):(-(a)))
 19 #define lowbit(a) (a&(-a))
 20 #define sqr(a) ((a)*(a))
 21 #define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
 22 #define mem(a,b) memset(a,b,sizeof(a))
 23 #define eps (1e-8)
 24 #define J 10
 25 #define mod 1000000007
 26 #define MAX 0x7f7f7f7f
 27 #define PI 3.14159265358979323
 28 #define N 1004
 29 #define M 10004
 30 using namespace std;
 31 typedef long long LL;
 32 int cas,cass;
 33 int n,m,lll,ans;
 34 struct xxx
 35 {
 36     int x,y;
 37 }shang[N][N],xia[N][N],zuo[N][N],you[N][N];
 38 int a[N][N];
 39 void changeshang(int x1,int y1,int x2,int y2)
 40 {
 41     xxx s1,s2;
 42     s1=shang[x1][y1];
 43     s2=shang[x2][y2];
 44     xia[s1.x][s1.y].x=x2,xia[s1.x][s1.y].y=y2;
 45     xia[s2.x][s2.y].x=x1,xia[s2.x][s2.y].y=y1;
 46     shang[x1][y1]=s2;
 47     shang[x2][y2]=s1;
 48 }
 49 void changexia(int x1,int y1,int x2,int y2)
 50 {
 51     xxx s1,s2;
 52     s1=xia[x1][y1];
 53     s2=xia[x2][y2];
 54     shang[s1.x][s1.y].x=x2,shang[s1.x][s1.y].y=y2;
 55     shang[s2.x][s2.y].x=x1,shang[s2.x][s2.y].y=y1;
 56     xia[x1][y1]=s2;
 57     xia[x2][y2]=s1;
 58 }
 59 void changezuo(int x1,int y1,int x2,int y2)
 60 {
 61     xxx s1,s2;
 62     s1=zuo[x1][y1];
 63     s2=zuo[x2][y2];
 64     you[s1.x][s1.y].x=x2,you[s1.x][s1.y].y=y2;
 65     you[s2.x][s2.y].x=x1,you[s2.x][s2.y].y=y1;
 66     zuo[x1][y1]=s2;
 67     zuo[x2][y2]=s1;
 68 }
 69 void changeyou(int x1,int y1,int x2,int y2)
 70 {
 71     xxx s1,s2;
 72     s1=you[x1][y1];
 73     s2=you[x2][y2];
 74     zuo[s1.x][s1.y].x=x2,zuo[s1.x][s1.y].y=y2;
 75     zuo[s2.x][s2.y].x=x1,zuo[s2.x][s2.y].y=y1;
 76     you[x1][y1]=s2;
 77     you[x2][y2]=s1;
 78 }
 79 void print()
 80 {
 81     int i,j,x,y,ii,jj;
 82     for(i=1;i<=n;i++)
 83     {
 84         x=you[i][0].x;y=you[i][0].y;
 85         for(j=1;j<=m;j++)
 86         {
 87             printf("%d ",a[x][y]);
 88             ii=you[x][y].x;
 89             jj=you[x][y].y;
 90             x=ii;y=jj;
 91         }
 92         puts("");
 93     }
 94     puts("");
 95 }
 96 int main()
 97 {
 98     #ifndef ONLINE_JUDGE
 99 //    freopen("1.txt","r",stdin);
100 //    freopen("2.txt","w",stdout);
101     #endif
102     int i,j,k;
103     int X,Y,XX,YY,x,y,xx,yy,ii,jj,aa,bb,cc,dd,ww,hh;
104 //    for(scanf("%d",&cas);cas;cas--)
105 //    for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
106 //    while(~scanf("%s",s+1))
107     while(~scanf("%d",&n))
108     {
109         mem(shang,0);mem(xia,0);mem(zuo,0);mem(you,0);
110         scanf("%d%d",&m,&cas);
111         for(i=1;i<=n;i++)
112             for(j=1;j<=m;j++)
113                 scanf("%d",&a[i][j]);
114         for(i=0;i<=n;i++)
115             for(j=0;j<=m;j++)
116                 xia[i][j].x=i+1,xia[i][j].y=j,you[i][j].x=i,you[i][j].y=j+1;
117         for(i=1;i<=n+1;i++)
118             for(j=1;j<=m+1;j++)
119                 shang[i][j].x=i-1,shang[i][j].y=j,zuo[i][j].x=i,zuo[i][j].y=j-1;
120         for(k=1;k<=cas;k++)
121         {
122             scanf("%d%d%d%d%d%d",&aa,&bb,&cc,&dd,&hh,&ww);
123             
124             X=you[aa][0].x,Y=you[aa][0].y;
125             for(i=1;i<bb;i++)
126             {
127                 ii=you[X][Y].x,jj=you[X][Y].y;
128                 X=ii,Y=jj;
129             }
130             XX=you[cc][0].x,YY=you[cc][0].y;
131             for(i=1;i<dd;i++)
132             {
133                 ii=you[XX][YY].x,jj=you[XX][YY].y;
134                 XX=ii,YY=jj;
135             }
136             //==================
137             x=X,y=Y,xx=XX,yy=YY;
138             for(i=0;i<ww;i++)
139             {
140                 changeshang(x,y,xx,yy);
141                 ii=you[x][y].x,jj=you[x][y].y;
142                 x=ii,y=jj;
143                 ii=you[xx][yy].x,jj=you[xx][yy].y;
144                 xx=ii,yy=jj;
145             }
146             //==================
147             x=X,y=Y,xx=XX,yy=YY;
148             for(i=1;i<hh;i++)
149             {
150                 ii=xia[x][y].x,jj=xia[x][y].y;
151                 x=ii,y=jj;
152                 ii=xia[xx][yy].x,jj=xia[xx][yy].y;
153                 xx=ii,yy=jj;
154             }
155             for(i=0;i<ww;i++)
156             {
157                 changexia(x,y,xx,yy);
158                 ii=you[x][y].x,jj=you[x][y].y;
159                 x=ii,y=jj;
160                 ii=you[xx][yy].x,jj=you[xx][yy].y;
161                 xx=ii,yy=jj;
162             }
163             //==================
164             x=X,y=Y,xx=XX,yy=YY;
165             for(i=0;i<hh;i++)
166             {
167                 changezuo(x,y,xx,yy);
168                 ii=xia[x][y].x,jj=xia[x][y].y;
169                 x=ii,y=jj;
170                 ii=xia[xx][yy].x,jj=xia[xx][yy].y;
171                 xx=ii,yy=jj;
172             }
173             //==================
174             x=X,y=Y,xx=XX,yy=YY;
175             for(i=1;i<ww;i++)
176             {
177                 ii=you[x][y].x,jj=you[x][y].y;
178                 x=ii,y=jj;
179                 ii=you[xx][yy].x,jj=you[xx][yy].y;
180                 xx=ii,yy=jj;
181                 
182             }
183             for(i=0;i<hh;i++)
184             {
185                 changeyou(x,y,xx,yy);
186                 ii=xia[x][y].x,jj=xia[x][y].y;
187                 x=ii,y=jj;
188                 ii=xia[xx][yy].x,jj=xia[xx][yy].y;
189                 xx=ii,yy=jj;
190             }
191             
192             //print();
193         }
194         print();
195     }
196     return 0;
197 }
198 /*
199 //
200 
201 //
202 */
View Code

 

posted @ 2016-08-23 18:54  Cool639zhu  阅读(383)  评论(0编辑  收藏  举报