标签:
题目链接:
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 */
【链表】【模拟】Codeforces 706E Working routine
标签:
原文地址:http://www.cnblogs.com/Coolxxx/p/5800564.html