zoukankan      html  css  js  c++  java
  • 【链表】【模拟】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
  • 相关阅读:
    hdu 2019 数列有序!
    hdu 2023 求平均成绩
    HDU 5805 NanoApe Loves Sequence (思维题) BestCoder Round #86 1002
    51nod 1264 线段相交
    Gym 100801A Alex Origami Squares (求正方形边长)
    HDU 5512 Pagodas (gcd)
    HDU 5510 Bazinga (字符串匹配)
    UVALive 7269 Snake Carpet (构造)
    UVALive 7270 Osu! Master (阅读理解题)
    UVALive 7267 Mysterious Antiques in Sackler Museum (判断长方形)
  • 原文地址:https://www.cnblogs.com/Coolxxx/p/5800564.html
Copyright © 2011-2022 走看看