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
  • 相关阅读:
    107.JsonResponse
    106.HttpResponse对象详解
    前端学习笔记系列一:2 Vue的单文件组件
    前端学习笔记系列一:1.export default / export const
    @vue-cli的安装及vue项目创建
    Github版本控制系统
    C# 篇基础知识11——泛型和集合
    C# 篇基础知识10——多线程
    C# 篇基础知识9——特性、程序集和反射
    C# 篇基础知识8——正则表达式
  • 原文地址:https://www.cnblogs.com/Coolxxx/p/5800564.html
Copyright © 2011-2022 走看看