NOIP模拟 table - 矩阵链表
题目大意:
给一个n*m的矩阵,每次交换两个大小相同的不重叠的子矩阵,输出最后的矩阵
题目分析:
这题向我们展示了出神入化的链表是如何炼成的。思想都懂,实现是真的需要技术,%%%
用一副链表来表示该矩阵,每个节点记录他的右节点和下节点,这样在交换两个矩阵时,只需要暴力交换两个矩阵的边框,并更新边框外面的相关信息,边框内的信息不用更改(相对位置不变),最后从左上角输出即可。
code
#include<bits/stdc++.h>
using namespace std;
namespace IO{
inline int read(){
int i = 0, f = 1; char ch = getchar();
for(; (ch < '0' || ch > '9') && ch != '-'; ch = getchar());
if(ch == '-') f = -1, ch = getchar();
for(; ch >= '0' && ch <= '9'; ch = getchar()) i = (i << 3) + (i << 1) + (ch - '0');
return i * f;
}
inline void wr(int x){
if(x < 0) putchar('-'), x = -x;
if(x > 9) wr(x / 10);
putchar(x % 10 + '0');
}
}using namespace IO;
const int N = 1005, M = 1005003;
int n, m, q, v[M], num[N][N], tot;
int lst[M][2];
inline int get(int x, int y){
int now = num[0][0];
for(int i = 1; i <= x; i++) now = lst[now][1];
for(int i = 1; i <= y; i++) now = lst[now][0];
return now;
}
int main(){
freopen("h.in", "r", stdin);
n = read(), m = read(), q = read();
for(register int i = 1; i <= n; i++)
for(register int j = 1; j <= m; j++)
v[num[i][j] = ++tot] = read();
// for(int i = 1; i <= tot; i++) cout<<v[i]<<endl;
for(register int i = 0; i <= m + 1; i++) num[0][i] = ++tot, num[n + 1][i] = ++tot;
for(register int i = 1; i <= n; i++) num[i][0] = ++tot, num[i][m + 1] = ++tot;
for(register int i = 0; i <= n; i++)
for(register int j = 0; j <= m; j++){
lst[num[i][j]][0] = num[i][j + 1];
lst[num[i][j]][1] = num[i + 1][j];
}
// for(int i = 1; i <= n; i++)
// for(int j = 1; j <= m; j++)
// cout<<i<<" @"<<j<<" "<<lst[num[i][j]][0]<<" "<<lst[num[i][j]][1]<<endl;
for(; q; q--){
int a, b, c, d, h, w;
a = read(), b = read(), c = read(), d = read(), h = read(), w = read();
int pos1 = get(a - 1, b - 1), pos2 = get(c - 1, d - 1);
// cout<<pos1<<" "<<pos2<<endl;
register int t1, t2, ww, hh;
for(t1 = pos1, t2 = pos2, ww = 1; ww <= w; ww++)
swap(lst[t1 = lst[t1][0]][1], lst[t2 = lst[t2][0]][1]);
for(hh = 1; hh <= h; hh++)
swap(lst[t1 = lst[t1][1]][0], lst[t2 = lst[t2][1]][0]);
for(t1 = pos1, t2 = pos2, hh = 1; hh <= h; hh++)
swap(lst[t1 = lst[t1][1]][0], lst[t2 = lst[t2][1]][0]);
for(ww = 1; ww <= w; ww++)
swap(lst[t1 = lst[t1][0]][1], lst[t2 = lst[t2][0]][1]);
}
int now = num[0][0];
for(register int i = 1; i <= n; i++){
for(register int j = 1, t = now = lst[now][1]; j <= m; j++)
cout<<v[t = lst[t][0]]<<" ";
cout<<endl;
}
return 0;
}
NOIP模拟 table - 矩阵链表的更多相关文章
- 2018.08.29 NOIP模拟 table(拓扑排序+建图优化)
[描述] 给出一个表格,N 行 M 列,每个格子有一个整数,有些格子是空的.现在需要你 来做出一些调整,使得每行都是非降序的.这个调整只能是整列的移动. [输入] 第一行两个正整数 N 和 M. 接下 ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- NOI.AC NOIP模拟赛 第三场 补记
NOI.AC NOIP模拟赛 第三场 补记 列队 题目大意: 给定一个\(n\times m(n,m\le1000)\)的矩阵,每个格子上有一个数\(w_{i,j}\).保证\(w_{i,j}\)互不 ...
- NOIP模拟题汇总(加厚版)
\(NOIP\)模拟题汇总(加厚版) T1 string 描述 有一个仅由 '0' 和 '1' 组成的字符串 \(A\),可以对其执行下列两个操作: 删除 \(A\)中的第一个字符: 若 \(A\)中 ...
- 2014-10-31 NOIP模拟赛
10.30 NOIp 模拟赛 时间 空间 测试点 评测方式 挖掘机(dig.*) 1s 256M 10 传统 黑红树(brtree.*) 2s 256M 10 传统 藏宝图(treas. ...
- 9.9 NOIP模拟题
9.9 NOIP模拟题 T1 两个圆的面积求并 /* 计算圆的面积并 多个圆要用辛普森积分解决 这里只有两个,模拟计算就好 两圆相交时,面积并等于中间两个扇形面积减去两个三角形面积 余弦定理求角度,算 ...
- 8.1 NOIP模拟11
8.1 NOIP模拟 11 今天上午返校之后,颓了一会,然后下午就开始考试,中午睡着了,然后刚开始考试的时候就困的一匹,我一看T1,woc,这不是之前线段树专题的题啊,和那道题差不多,所以我..... ...
- NOIP模拟赛 6.29
2017-6-29 NOIP模拟赛 Problem 1 机器人(robot.cpp/c/pas) [题目描述] 早苗入手了最新的Gundam模型.最新款自然有着与以往不同的功能,那就是它能够自动行走, ...
- 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组
2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...
随机推荐
- STL之vector容器的实现框架
说明:本文仅供学习交流,转载请标明出处,欢迎转载. 实现vector容器的思路等同于实现一个动态数组,以下我们參照源代码的相关资料,给出一个vector容器的大致框架,仅仅有声明,没给出详细的实现. ...
- clear属性来取消浮动
在非IE浏览器(如Firefox)下,当容器的高度为auto,且容器的内容中有浮动(float为left或right)的元素,在这种情况下,容器的高度不能自动伸长以适应内容的高度,使得内容溢出到容器外 ...
- E11 css hack
E11 识别\0 { color:red; color:blue \0; } chrome下颜色是红色.IE11是蓝色
- 【例题5-7 UVA - 136】Ugly Numbers
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 每个丑数x,都能生成3个丑数2x,3x,5x 则我们以1作为起点. 生成丑数. 每次取出set里面最小的那个数. 然后用它去生成其他 ...
- 【物理/数学】—— 概念的理解 moment、momentum
moment:矩,momentum:[物] 动量:动力:冲力: 数学意义上的 moment(矩)概念其实源自于物理范畴.首先我们来介绍物理学意义上的矩(Momentum)的概念. 1. 物理学意义上的 ...
- windows ffmpeg 的安装
本文我们要安装的是 windows 下的 ffmpeg 命令行工具,安装的步骤十分简单,分为:下载.解压.配置环境变量. 下载,进入 http://ffmpeg.org/download.html#b ...
- Caffe 安装 Ubuntu14.04+CUDA7.0/7.5(亲测有效)
自己安装Caffe的过程中,参考了很多资料,但由于版本或者其他原因,安装过程中总是遇到这样或者那样的问题,因此留做记录,方便之后查看,也希望对遇到相似麻烦的朋友们提供帮助. 下面我们开始安装吧: 硬 ...
- UVA 11732 - strcmp() Anyone? 字典树
传送门:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...
- VS2010下配置Opencv2.4.3 .
VS2008下OpenCV的配置过程在OpenCV论坛上写的很详细,具体过程可以见如下链接http://www.opencv.org.cn/index.php/VC_2008_Express%E4%B ...
- 【例题5-1 UVA 10474 】Where is the Marble?
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 排序 用lower_bound找就可以了. ->lower_bound,如果里面所有的数字都比x小,那么它的返回值会越界! [ ...