【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> # ...
随机推荐
- Generalized Power Method for Sparse Principal Component Analysis
目录 重点 算法 这篇文章,看的晕晕的,但是被引用了400多次了,就简单地记一笔. 这个东西,因为\(\ell_1\)范数,所以会稀疏化,当然,和\(\gamma\)有关. 重点 我想重点写的地方是下 ...
- Echatrs 中PIE饼图中间位置怎么显示总数值?
title: { text: '总资产', subtext: '2000000.00', x: 'center', y: 'center' }图例:
- 解决sqoop连接mysq错误
一.问题描述 1.由于当前集群没有配置Zookeeper.hcatalog.accumlo,因此应该在sqoop的配置文件中注释掉判断Zookeeper.hcatalog.accumlo路径是否正确的 ...
- mysql常用命令行操作(一):登陆、退出、查看端口、修改密码、刷新
一.登陆和退出mysql mysql -u root -p # 登陆exit # 退出 二.查看当前mysql的端口号 show global variables like 'port'; 三.查看用 ...
- 消除element.style { }
1.在写前台页面时,我们会发现控制台里会自动出现一些样式覆盖掉我们定义的样式: 解决的办法: 把被覆盖的样式单独定义出来,并在样式后面加上 !important,表示高优先级.
- 2019省赛训练组队赛3.26周二---FJUT 2016
A.Minimum’s Revenge There is a graph of n vertices which are indexed from 1 to n. For any pair of di ...
- JDBC+Servlet+JSP的学生案例增删改查
数据库信息传输到页面实现. 先进行学生信息页面展示: 接口IStudentDao public interface IStudentDao { /** * 保存操作 * @param stu 学生对象 ...
- http1.0 1.1 与2.0
长连接 HTTP 1.0需要使用keep-alive参数来告知服务器端要建立一个长连接,而HTTP1.1默认支持长连接. HTTP是基于TCP/IP协议的,创建一个TCP连接是需要经过三次握手的,有一 ...
- java8新特性:interface中的static方法和default方法
java8中接口有两个新特性,一个是静态方法,一个是默认方法. static方法 java8中为接口新增了一项功能:定义一个或者多个静态方法. 定义用法和普通的static方法一样: public i ...
- 【gedit】 显示行号
打开gedit文本编辑器->Edit(编辑)->preferences(预设)->view(视图)->在Display line numbers前打勾->close