【CodeForces706E】Working routine(二维链表)
BUPT2017 wintertraining(15) #6B
题意
q次操作,每次把两个给定子矩阵交换,求最后的矩阵。(2 ≤ n, m ≤ 1000, 1 ≤ q ≤ 10 000)
题解
用R[i]和D[i]记录编号i的右方和下方的编号。交换两个子矩阵只要修改四周的R和D即可。为了方便查找给定位置的编号,每行每列都需要头结点,也就是给一个编号。
代码
#include <cstdio>
#include <iostream>
#define N 1005*1005
using namespace std;
int n,m,q;
int v[N],D[N],R[N];
int no(int x,int y){
return x*(m+1)+y;
}
int main() {
scanf("%d%d%d",&n,&m,&q);
for(int i=0;i<=n;i++)
for(int j=0;j<=m;j++)
D[no(i,j)]=no(i+1,j),R[no(i,j)]=no(i,j+1);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&v[no(i,j)]);
while(q--){
int x,y,xx,yy,h,w;
scanf("%d%d%d%d%d%d",&x,&y,&xx,&yy,&h,&w);
int u=y-1,v=yy-1,uu=y-1+w,vv=yy-1+w;
for(int i=1;i<x;i++)u=D[u],uu=D[uu];//u(x-1,y-1);uu(x-1,y-1+h)
for(int i=1;i<xx;i++)v=D[v],vv=D[vv];//v(xx-1,yy-1);vv(xx-1,yy-1+h)
for(int j=u,k=v,i=0;i<w;i++){//交换上面一行的D
j=R[j],k=R[k];
swap(D[j],D[k]);
}
for(int i=0;i<h;i++){//分别交换左右两列的R
u=D[u],v=D[v];
swap(R[u],R[v]);
uu=D[uu],vv=D[vv];
swap(R[uu],R[vv]);
}
for(int i=0;i<w;i++){//交换最下行的D
u=R[u],v=R[v];
swap(D[u],D[v]);
}
}
for(int i=1,x;i<=n;i++){
x=R[no(i,0)];
for(int j=1;j<=m;j++)
printf("%d ",v[x]),x=R[x];
puts("");
}
return 0;
}
【CodeForces706E】Working routine(二维链表)的更多相关文章
- 【NOIP模拟赛】Drink 二维链表+模拟
我觉得这道题的主旨应该是模拟,但是如果说他是二维链表的話也不為過.這道題的主體思路就是把原來旋轉點的O(n^2)變成了旋轉邊界的O(n).怎麼旋轉邊界呢,就好像是把原來的那些點都於上下左右四個點連線, ...
- C# 链表去重 List 一维 二维 分别使用 Distinct() GroupBy() 方法
分别使用List中Distinct(),GroupBy()实现链表的去重. 1.先上效果: 一维链表中分别有元素“aa”,"bb",'aa','aa',"cc" ...
- 通过数组初始化链表的两种方法:指向指针的引用node *&tail和指向指针的指针(二维指针)node **tail
面试高频题:单链表的逆置操作/链表逆序相关文章 点击打开 void init_node(node *tail,char *init_array) 这样声明函数是不正确的,函数的原意是通过数组初始化链表 ...
- 【原创】只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(四)
全系列Index: [原创]只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(一) [原创]只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(二) [原创]只学到二维数组和结构体,不用链表也能 ...
- C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com
原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...
- C-指针,二级指针,二维数组作为函数参数使用,C语言链表(详解)
一级指针 int *p; //表示定义一个int型(4字节)的指针p &p //表示p自身的地址位置 p ...
- C语言:将带头节点的单向链表结点域中的数据从小到大排序。-求出单向链表结点(不包括头节点)数据域中的最大值。-将M*N的二维数组中的数据,按行依次放入一维数组,
//函数fun功能是将带头节点的单向链表结点域中的数据从小到大排序. //相当于数组的冒泡排序. #include <stdio.h> #include <stdlib.h> ...
- C语言一维数组、二维数组、结构体的初始化
C语言数组的初始化表示方法 一.C语言一维数组初始化: (1)在定义数组时对数组元素赋以初值.如: static int a[10]={0,1,2,3,4,5,6,7,8,9}; 经过上面的定义和初始 ...
- 使用Graham扫描法求二维凸包的一个程序
#include <iostream> #include <cstring> #include <cstdlib> #include <cmath> # ...
随机推荐
- 记一个JS树结构路径查找
var a=[ { "id" : "0000", "text" : "R1", "children" ...
- 学习yii2.0——事件
参考:https://www.yiichina.com/doc/guide/2.0/concept-events 事件 yii框架中的事件定义和JavaScript中的事件定义差不多:为某个事件绑定一 ...
- semantic-ui 分割线
分割线即原生html中的<hr>标签.不过semantic-ui中将<hr>美化了一下下. 1.基础分割线 需要注意的是分割线只能使用div标签和p标签,不能使用span标签. ...
- Failure to transfer org.apache.maven:maven-archiver:pom:2.5 from https://repo.maven.apache.org/maven2 was cached in the local repository, resolution will not be reattempted until the update interval o
pom.xml报错: Failure to transfer org.apache.maven:maven-archiver:pom:2.5 from https://repo.maven.apach ...
- Win1064位下mysql插入百万行数据耗时问题
performance - Inserting 1 Million records is taking too much time MYSQL - Stack Overflowhttps://stac ...
- nginx强制使用https访问(http跳转到https)
Nginx 的 Location 从零开始配置 - 市民 - SegmentFault 思否https://segmentfault.com/a/1190000009651161 nginx配置loc ...
- [转帖]windows+xshell+xming访问非桌面版Linux服务器
windows+xshell+xming访问非桌面版Linux服务器 2016年06月05日 00:09:11 jxxiaohou 阅读数:11996 标签: Linux 更多 个人分类: Linux ...
- [转帖]SSH 的 三种代理功能.
https://www.zhihu.com/people/skywind3000/activities 之前用过frp 知道 ssh 有一 反向代理的功能 没想到 还有这么多高级功能 收藏一下. ss ...
- childNodes遍历DOM节点树
childNodes遍历DOM节点树 var s = ""; function travel(space,node) { if(node.tagName){ s += space ...
- JS 将值插入数组中
使用 push 方法 1.var arr = [1,2,3] arr.push(数值) 或者 arr.push({xxx:数值}) 2.输出数组中的最后一个 console.log(arr.[arr. ...