【链表】【模拟】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了。
把矩阵看成链表,链表的方向有上下左右四种,其实每次交换两个子矩阵只改变的外围一圈的链表值,而内部的链接是没有变的,所以可以按照链表做。
每次交换的时候,把子矩阵的最上、下、左、右的边的相应需要改变的链表值和另一个矩阵交换,这样就把两维问题转化为一维。
//
//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的更多相关文章
- CodeForces 706E Working routine
十字链表. 开一个十字链表,矩阵中每一格作为一个节点,记录五个量: $s[i].L$:$i$节点左边的节点编号 $s[i].R$:$i$节点右边的节点编号 $s[i].U$:$i$节点上面的节点编号 ...
- Working routine CodeForces - 706E (链表)
大意: 给定矩阵, q个操作, 每次选两个子矩阵交换, 最后输出交换后的矩阵 双向十字链表模拟就行了 const int N = 1500; int n, m, q; struct _ { int v ...
- 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 ...
- [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 ...
- 【洛谷】NOIP提高组模拟赛Day2【动态开节点/树状数组】【双头链表模拟】
U41571 Agent2 题目背景 炎炎夏日还没有过去,Agent们没有一个想出去外面搞事情的.每当ENLIGHTENED总部组织活动时,人人都说有空,结果到了活动日,却一个接着一个咕咕咕了.只有不 ...
- 贪心+模拟 Codeforces Round #288 (Div. 2) C. Anya and Ghosts
题目传送门 /* 贪心 + 模拟:首先,如果蜡烛的燃烧时间小于最少需要点燃的蜡烛数一定是-1(蜡烛是1秒点一支), num[g[i]]记录每个鬼访问时已点燃的蜡烛数,若不够,tmp为还需要的蜡烛数, ...
- 模拟 Codeforces Round #203 (Div. 2) C. Bombs
题目地址:http://codeforces.com/problemset/problem/350/C /* 题意:机器人上下左右走路,把其他的机器人都干掉要几步,好吧我其实没读懂题目, 看着样例猜出 ...
- 模拟 Codeforces Round #249 (Div. 2) C. Cardiogram
题目地址:http://codeforces.com/contest/435/problem/C /* 题意:给一组公式,一组数据,计算得到一系列的坐标点,画出折线图:) 模拟题:蛮恶心的,不过也简单 ...
- [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)< ...
随机推荐
- oracle实现自动记录存储过程、自定义函数执行错误
CREATE OR REPLACE Package Pkg_Stm_Prgerrlog As --Purpose: 实现记录系统错误异常信息,便于问题跟踪 Procedure Sp_Stm_Prger ...
- Linux yum命令重装mysql
如果是 rpm 安装的话,可以用 rpm -e mysql-server 如果是yum安装的,可以用 yum remove mysql* 删除MySQL安装文件夹 然后使用yum安装mysql: 1. ...
- 关于webservice不支持方法重载的解决办法
今天在写WebService时,出现了这样的错误: Count(Int32, Int32) 和 Count(Int32) 同时使用消息名称“Count”.使用 WebMethod 自定义特性的 Mes ...
- oracle创建实例SID
用oracle用户登录 输入startx开发可视化界面,打开命令行模式 (如果只有壁纸,没有桌面图标和任务栏,按下 Ctrl + Alt + T 打开命令行) 输入dbca打开配置窗口 最后就各种下一 ...
- Gridview分頁保存選項
#region //'Revision: 1.00 Created Date: 2013/08/02 Created ID: Una [#1300071]增加多選框 /// <summary&g ...
- 内联式css样式,直接写在现有的HTML标签中
CSS样式可以写在哪些地方呢?从CSS 样式代码插入的形式来看基本可以分为以下3种:内联式.嵌入式和外部式三种.这一小节先来讲解内联式. 内联式css样式表就是把css代码直接写在现有的HTML标签中 ...
- Javascript的AMD规范
Javascript发展到今天,已经从一个小丑语言变成了不可替代的前端利器,已经脱离了低端的玩笑脚步,而转变为有规可依的强大语言. 本文主要讲述下如今被大力推广的AMD规范,为什么要AMD,什么场景是 ...
- 通用数据挖掘[ZZ]
一.什么是数据挖掘?许多人认为数据挖掘更像是一门哲学,或数学的组成部分,而不是业务需求的实际解决方案.您可以从采用的各种定义中看出这一点,例如:“数据挖掘是对非常大型的数据进行的研究和分析,采用自动或 ...
- OpenCV中Mat的详解
每次碰到Mat都得反复查具体的用法,网上的基础讲解不多,难得看到一篇,赶快转来收藏~ 原文地址:http://www.opencvchina.com/thread-1039-1-1.html 目标 我 ...
- skip-grant-tables的作用
skip-grant-tables:非常有用的mysql启动参数(不启动grant-tables授权表) skip-grant-tables:非常有用的mysql启动参数 介绍一个非常有用的mys ...