十字链表。

开一个十字链表,矩阵中每一格作为一个节点,记录五个量:

$s[i].L$:$i$节点左边的节点编号

$s[i].R$:$i$节点右边的节点编号

$s[i].U$:$i$节点上面的节点编号

$s[i].D$:$i$节点下面的节点编号

$s[i].V$:$i$节点存储的值

每次操作,只要把四个边上的那些边拆掉,重新连上新的边就可以了。时间复杂度:$O(qn)$。

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0),eps=1e-;
void File()
{
freopen("D:\\in.txt","r",stdin);
freopen("D:\\out.txt","w",stdout);
} const int maxn=;
int n,m,k,sz;
struct X { int u,d,l,r,v; }s[maxn*maxn];
int a[maxn*maxn],id[maxn][maxn]; int main()
{
scanf("%d%d%d",&n,&m,&k); for(int i=;i<=n;i++) id[i][]=sz++; for(int j=;j<=m;j++) id[][j]=sz++;
for(int i=;i<=n;i++) for(int j=;j<=m;j++) id[i][j]=sz++;
for(int i=;i<=n;i++) id[i][m+]=sz++; for(int j=;j<=m;j++) id[n+][j]=sz++; for(int i=;i<=n+;i++)
{
for(int j=;j<=m+;j++)
{
s[id[i][j]].l=-; s[id[i][j]].r=-; s[id[i][j]].u=-; s[id[i][j]].d=-; if(j->=) s[id[i][j]].l=id[i][j-]; if(j+<=m+) s[id[i][j]].r=id[i][j+];
if(i->=) s[id[i][j]].u=id[i-][j]; if(i+<=n+) s[id[i][j]].d=id[i+][j];
}
} for(int i=;i<=n;i++) for(int j=;j<=m;j++) scanf("%d",&s[id[i][j]].v); for(int i=;i<=k;i++)
{
int r1,c1,r2,c2,h,w;
scanf("%d%d%d%d%d%d",&r1,&c1,&r2,&c2,&h,&w); int p1,p2,t1,t2,t3,t4,P1,P2; p1=r1,p2=r2;
for(int j=;j<=c1;j++) p1=s[p1].r; for(int j=;j<=c2;j++) p2=s[p2].r; P1=p1,P2=p2;
for(int j=;j<=w-;j++) P1=s[P1].r; for(int j=;j<=w-;j++) P2=s[P2].r;
for(int j=;j<=h-;j++) P1=s[P1].d; for(int j=;j<=h-;j++) P2=s[P2].d; t1=p1,t2=p2; t3=s[p1].l; t4=s[p2].l;
for(int j=;j<=h;j++) swap(s[t1].l,s[t2].l), t1=s[t1].d, t2=s[t2].d;
for(int j=;j<=h;j++) swap(s[t3].r,s[t4].r), t3=s[t3].d, t4=s[t4].d; t1=p1,t2=p2; t3=s[p1].u; t4=s[p2].u;
for(int j=;j<=w;j++) swap(s[t1].u,s[t2].u), t1=s[t1].r, t2=s[t2].r;
for(int j=;j<=w;j++) swap(s[t3].d,s[t4].d), t3=s[t3].r, t4=s[t4].r; p1=P1,p2=P2; t1=p1,t2=p2; t3=s[p1].d; t4=s[p2].d;
for(int j=;j<=w;j++) swap(s[t1].d,s[t2].d), t1=s[t1].l, t2=s[t2].l;
for(int j=;j<=w;j++) swap(s[t3].u,s[t4].u), t3=s[t3].l, t4=s[t4].l; t1=p1,t2=p2; t3=s[p1].r; t4=s[p2].r;
for(int j=;j<=h;j++) swap(s[t1].r,s[t2].r), t1=s[t1].u, t2=s[t2].u;
for(int j=;j<=h;j++) swap(s[t3].l,s[t4].l), t3=s[t3].u, t4=s[t4].u; }
for(int i=;i<=n;i++)
{
int p=i;
for(int j=;j<=m;j++)
p=s[p].r, printf("%d ",s[p].v);
printf("\n");
} return ;
}

CodeForces 706E Working routine的更多相关文章

  1. 【链表】【模拟】Codeforces 706E Working routine

    题目链接: http://codeforces.com/problemset/problem/706/E 题目大意: 给一个N*M的矩阵,Q个操作,每次把两个同样大小的子矩阵交换,子矩阵左上角坐标分别 ...

  2. [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 ...

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

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

  4. Magolor的数据结构作业

    \(CodeForces 706E ~Working routine\) 给出一个矩阵,每次操作交换两个子矩阵,求最后状态. 使用链表存储,每次交换后,影响到的之后矩阵边缘的指针,暴力修改. \(~~ ...

  5. 十字链表 Codeforces Round #367 E Working routine

    // 十字链表 Codeforces Round #367 E Working routine // 题意:给你一个矩阵,q次询问,每次交换两个子矩阵,问最后的矩阵 // 思路:暴力肯定不行.我们可以 ...

  6. codeforces B. Routine Problem 解题报告

    题目链接:http://codeforces.com/problemset/problem/337/B 看到这个题目,觉得特别有意思,因为有熟悉的图片(看过的一部电影).接着让我很意外的是,在纸上比划 ...

  7. Codeforces Round #196 (Div. 2) B. Routine Problem

    screen 尺寸为a:b video 尺寸为 c:d 如果a == c 则 面积比为 cd/ab=ad/cb (ad < cb) 如果b == d 则 面积比为 cd/ab=cb/ad  (c ...

  8. Codeforces gym 100685 F. Flood bfs

    F. FloodTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100685/problem/F Desc ...

  9. Codeforces Round #367 (Div. 2) (A,B,C,D,E)

    Codeforces Round 367 Div. 2 点击打开链接 A. Beru-taxi (1s, 256MB) 题目大意:在平面上 \(n\) 个点 \((x_i,y_i)\) 上有出租车,每 ...

随机推荐

  1. vector如何进行局部排序

    对于vector的全体排序,我们知道sort(vv.begin(),vv.end())来进行的. 但是对于如果是局部排序的话,比如,vector有100个元素,但我只想对10-80之间的数进行排序,如 ...

  2. JavaScript插件——模态框

    Bootstrap3.0学习第十七轮(JavaScript插件——模态框)   前言 阅读之前您也可以到Bootstrap3.0入门学习系列导航中进行查看http://www.cnblogs.com/ ...

  3. 记录在IIS中安装部署Orchard遇到的问题

    本机环境:Windows 8.1 + IIS8.5 + VS2013+SQLServer2012 首先是从官网直接下载Orchard.Web 1.7.2版的安装包,在本机IIS上部署,按官方文档一步步 ...

  4. js闭包(转)

    一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量 ...

  5. SQL 语句中的union操作符

    前端时间,用到了union操作符,周末有时间总结下,w3c手册内容如下: SQL UNION操作符 UNION操作符用于合并两个或多个select语句的结果集. 注意:UNION内部select语句必 ...

  6. window.open()详解及浏览器兼容性问题

    一.基本语法:window.open(pageURL,name,parameters)其中:pageURL 为子窗口路径name  为子窗口名字parameters 为窗口参数(各参数用逗号分隔) 二 ...

  7. hdu1686

    题目意思:找到上串在下串中有多少个 Problem Description The French author Georges Perec (1936–1982) once wrote a book, ...

  8. Go语言Web框架gwk介绍4

    Go语言Web框架gwk介绍 (四)   事件 gwk支持事件系统,但并没有硬编码有哪些事件,而是采用了比较松散的定义方式. 订阅事件有两种方式: 调用On函数或者OnFunc函数 func On(m ...

  9. centos安装svn

    原文链接:http://blog.csdn.net/liuyuan_jq/article/details/2110814 1.SVN简介由于前些年在版本的管理上采用的都是CVS系统,总体上而言还是很优 ...

  10. 函数模板的trick

    函数模板的trick 让gcc支持成员函数模板的trick 罗朝辉 (http://www.cnblogs.com/kesalin/) 本文遵循“署名-非商业用途-保持一致”创作公用协议   gcc ...