题目链接:

  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了。

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

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

 //
//by coolxxx
//#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<iomanip>
#include<map>
#include<memory.h>
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//#include<stdbool.h>
#include<math.h>
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define abs(a) ((a)>0?(a):(-(a)))
#define lowbit(a) (a&(-a))
#define sqr(a) ((a)*(a))
#define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
#define mem(a,b) memset(a,b,sizeof(a))
#define eps (1e-8)
#define J 10
#define mod 1000000007
#define MAX 0x7f7f7f7f
#define PI 3.14159265358979323
#define N 1004
#define M 10004
using namespace std;
typedef long long LL;
int cas,cass;
int n,m,lll,ans;
struct xxx
{
int x,y;
}shang[N][N],xia[N][N],zuo[N][N],you[N][N];
int a[N][N];
void changeshang(int x1,int y1,int x2,int y2)
{
xxx s1,s2;
s1=shang[x1][y1];
s2=shang[x2][y2];
xia[s1.x][s1.y].x=x2,xia[s1.x][s1.y].y=y2;
xia[s2.x][s2.y].x=x1,xia[s2.x][s2.y].y=y1;
shang[x1][y1]=s2;
shang[x2][y2]=s1;
}
void changexia(int x1,int y1,int x2,int y2)
{
xxx s1,s2;
s1=xia[x1][y1];
s2=xia[x2][y2];
shang[s1.x][s1.y].x=x2,shang[s1.x][s1.y].y=y2;
shang[s2.x][s2.y].x=x1,shang[s2.x][s2.y].y=y1;
xia[x1][y1]=s2;
xia[x2][y2]=s1;
}
void changezuo(int x1,int y1,int x2,int y2)
{
xxx s1,s2;
s1=zuo[x1][y1];
s2=zuo[x2][y2];
you[s1.x][s1.y].x=x2,you[s1.x][s1.y].y=y2;
you[s2.x][s2.y].x=x1,you[s2.x][s2.y].y=y1;
zuo[x1][y1]=s2;
zuo[x2][y2]=s1;
}
void changeyou(int x1,int y1,int x2,int y2)
{
xxx s1,s2;
s1=you[x1][y1];
s2=you[x2][y2];
zuo[s1.x][s1.y].x=x2,zuo[s1.x][s1.y].y=y2;
zuo[s2.x][s2.y].x=x1,zuo[s2.x][s2.y].y=y1;
you[x1][y1]=s2;
you[x2][y2]=s1;
}
void print()
{
int i,j,x,y,ii,jj;
for(i=;i<=n;i++)
{
x=you[i][].x;y=you[i][].y;
for(j=;j<=m;j++)
{
printf("%d ",a[x][y]);
ii=you[x][y].x;
jj=you[x][y].y;
x=ii;y=jj;
}
puts("");
}
puts("");
}
int main()
{
#ifndef ONLINE_JUDGE
// freopen("1.txt","r",stdin);
// freopen("2.txt","w",stdout);
#endif
int i,j,k;
int X,Y,XX,YY,x,y,xx,yy,ii,jj,aa,bb,cc,dd,ww,hh;
// for(scanf("%d",&cas);cas;cas--)
// for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
// while(~scanf("%s",s+1))
while(~scanf("%d",&n))
{
mem(shang,);mem(xia,);mem(zuo,);mem(you,);
scanf("%d%d",&m,&cas);
for(i=;i<=n;i++)
for(j=;j<=m;j++)
scanf("%d",&a[i][j]);
for(i=;i<=n;i++)
for(j=;j<=m;j++)
xia[i][j].x=i+,xia[i][j].y=j,you[i][j].x=i,you[i][j].y=j+;
for(i=;i<=n+;i++)
for(j=;j<=m+;j++)
shang[i][j].x=i-,shang[i][j].y=j,zuo[i][j].x=i,zuo[i][j].y=j-;
for(k=;k<=cas;k++)
{
scanf("%d%d%d%d%d%d",&aa,&bb,&cc,&dd,&hh,&ww); X=you[aa][].x,Y=you[aa][].y;
for(i=;i<bb;i++)
{
ii=you[X][Y].x,jj=you[X][Y].y;
X=ii,Y=jj;
}
XX=you[cc][].x,YY=you[cc][].y;
for(i=;i<dd;i++)
{
ii=you[XX][YY].x,jj=you[XX][YY].y;
XX=ii,YY=jj;
}
//==================
x=X,y=Y,xx=XX,yy=YY;
for(i=;i<ww;i++)
{
changeshang(x,y,xx,yy);
ii=you[x][y].x,jj=you[x][y].y;
x=ii,y=jj;
ii=you[xx][yy].x,jj=you[xx][yy].y;
xx=ii,yy=jj;
}
//==================
x=X,y=Y,xx=XX,yy=YY;
for(i=;i<hh;i++)
{
ii=xia[x][y].x,jj=xia[x][y].y;
x=ii,y=jj;
ii=xia[xx][yy].x,jj=xia[xx][yy].y;
xx=ii,yy=jj;
}
for(i=;i<ww;i++)
{
changexia(x,y,xx,yy);
ii=you[x][y].x,jj=you[x][y].y;
x=ii,y=jj;
ii=you[xx][yy].x,jj=you[xx][yy].y;
xx=ii,yy=jj;
}
//==================
x=X,y=Y,xx=XX,yy=YY;
for(i=;i<hh;i++)
{
changezuo(x,y,xx,yy);
ii=xia[x][y].x,jj=xia[x][y].y;
x=ii,y=jj;
ii=xia[xx][yy].x,jj=xia[xx][yy].y;
xx=ii,yy=jj;
}
//==================
x=X,y=Y,xx=XX,yy=YY;
for(i=;i<ww;i++)
{
ii=you[x][y].x,jj=you[x][y].y;
x=ii,y=jj;
ii=you[xx][yy].x,jj=you[xx][yy].y;
xx=ii,yy=jj; }
for(i=;i<hh;i++)
{
changeyou(x,y,xx,yy);
ii=xia[x][y].x,jj=xia[x][y].y;
x=ii,y=jj;
ii=xia[xx][yy].x,jj=xia[xx][yy].y;
xx=ii,yy=jj;
} //print();
}
print();
}
return ;
}
/*
// //
*/

【链表】【模拟】Codeforces 706E Working routine的更多相关文章

  1. CodeForces 706E Working routine

    十字链表. 开一个十字链表,矩阵中每一格作为一个节点,记录五个量: $s[i].L$:$i$节点左边的节点编号 $s[i].R$:$i$节点右边的节点编号 $s[i].U$:$i$节点上面的节点编号 ...

  2. Working routine CodeForces - 706E (链表)

    大意: 给定矩阵, q个操作, 每次选两个子矩阵交换, 最后输出交换后的矩阵 双向十字链表模拟就行了 const int N = 1500; int n, m, q; struct _ { int v ...

  3. Codeforces 1131 F. Asya And Kittens-双向链表(模拟或者STL list)+并查集(或者STL list的splice()函数)-对不起,我太菜了。。。 (Codeforces Round #541 (Div. 2))

    F. Asya And Kittens time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  4. [cf div 2 706E] Working routine

    [cf div 2 706E] Working routine Vasiliy finally got to work, where there is a huge amount of tasks w ...

  5. 【洛谷】NOIP提高组模拟赛Day2【动态开节点/树状数组】【双头链表模拟】

    U41571 Agent2 题目背景 炎炎夏日还没有过去,Agent们没有一个想出去外面搞事情的.每当ENLIGHTENED总部组织活动时,人人都说有空,结果到了活动日,却一个接着一个咕咕咕了.只有不 ...

  6. 贪心+模拟 Codeforces Round #288 (Div. 2) C. Anya and Ghosts

    题目传送门 /* 贪心 + 模拟:首先,如果蜡烛的燃烧时间小于最少需要点燃的蜡烛数一定是-1(蜡烛是1秒点一支), num[g[i]]记录每个鬼访问时已点燃的蜡烛数,若不够,tmp为还需要的蜡烛数, ...

  7. 模拟 Codeforces Round #203 (Div. 2) C. Bombs

    题目地址:http://codeforces.com/problemset/problem/350/C /* 题意:机器人上下左右走路,把其他的机器人都干掉要几步,好吧我其实没读懂题目, 看着样例猜出 ...

  8. 模拟 Codeforces Round #249 (Div. 2) C. Cardiogram

    题目地址:http://codeforces.com/contest/435/problem/C /* 题意:给一组公式,一组数据,计算得到一系列的坐标点,画出折线图:) 模拟题:蛮恶心的,不过也简单 ...

  9. [POJ1193][NOI1999]内存分配(链表+模拟)

    题意 时 刻 T 内存占用情况 进程事件 0 1 2 3 4 5 6 7 8 9 进程A申请空间(M=3, P=10)<成功> 1 A 2 A B 进程B申请空间(M=4, P=3)< ...

随机推荐

  1. URL编码 URLEncoder 示例

    2016-12-27 对字符编码时的规则 通常如果一样东西需要编码,说明这样东西并不适合传输.原因多种多样,如Size过大,包含隐私数据. 对于Url来说,之所以要进行编码,一个是因为Url中有些字符 ...

  2. node里如何查看浏览器信息

    'use strict'; let http = require(`http`); http.createServer((req, res) => { console.log(req.heade ...

  3. document.documentElement.style判断浏览器是否支持Css3属性

    1.document.documentElement.style 属性定义了当前浏览器支持的所有Css属性 包括带前缀的和不带前缀的 例如:animation,webkitAnimation,msAn ...

  4. .net 学习路线感想

    从上到大学到现在工作,已经有六年多了,发现学习编程到以开发为工作也是一个挺长的过程的. 大学中,从c语言到java.C#到其他各种语言的学习,还有其他知识的学习如:数据库(oracle.sql Ser ...

  5. MYSQL命令行连接数据库

    连接数据库 mysql -uroot -proot -P3306 -Dmydemo # 参数详解 -uuser 用户user -ppwd 密码 -P3306 端口 -Dmysql 数据库 #显示所有数 ...

  6. jstl--c:choose标签

    今天使用c:choose标签,一直报错: 严重: Servlet.service() for servlet CheckIncome threw exceptionorg.apache.jasper. ...

  7. nuc970连接jlink进行单步调试的设置

    在 USB mode 下, 先跟 NuWriter 接上, 然后用以下的设定. 按 Keil 的 debug (不是 download to flash)就可以接上了.

  8. 【JQuery学习历程】2.JQuery选择器

    基本选择器 选择器 描述 返回 示例 #id 根据给定的id匹配元素 单个元素 $("#myId") .class 根据给定的class类匹配元素 集合元素 $(".my ...

  9. 用jQuery实现瀑布流效果学习笔记

    jQuery一直没系统的学,只知道是js库,封装了好多js函数,方便了开发.以前做过一个原生的图片网站瀑布流效果,超级麻烦,这次用了jQuery方法,瞬间代码浓缩了,只有56行js代码.神奇的让我来把 ...

  10. 原生Ajax + Promise

    有原生写的ajax + promise嫁接下 ;(function(root){ var LD = function(obj){ if( obj instanceof LD ) return obj; ...