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两种,分别 ...
随机推荐
- 15个常用的javaScript正则表达式--来自于javascript公众号
摘要 收集整理了15个常用的javaScript正则表达式,其中包括用户名.密码强度.整数.数字.电子邮件地址(Email).手机号码.身份证号.URL地址. IPv4地址. 十六进制颜色. 日期. ...
- 【CS Round #43 E】Coprime Pairs
[链接]点击打开链接 [题意] 让你选择n个数字,组成一个数组,使得这n个数字中恰好有k对,它们是互质的. [题解] 我们可以先找出前n个质数,那么接下来的问题就转化为,凑出rest = n*(n-1 ...
- mybatis中整合ehcache缓存框架的使用
mybatis整合ehcache缓存框架的使用 mybaits的二级缓存是mapper范围级别,除了在SqlMapConfig.xml设置二级缓存的总开关,还要在具体的mapper.xml中开启二级缓 ...
- [Nuxt] Add Arrays of Data to the Vuex Store and Display Them in Vue.js Templates
You add array of todos to the store simply by adding them to the state defined in your store/index.j ...
- JavaScript的String对象的属性和方法
---恢复内容开始--- 属性: length 字符串的长度 prototype 字符串的原型对象 constructor 字符串的构造函数,会返 ...
- 可直接复制粘贴的boostrap图标库网址
1:http://fontawesome.dashgame.com/ 2:http://www.kuiyu.net/art-34.html 3:http://www.bootcss.com/p/fon ...
- 使用ganglia监控hadoop及hbase集群 分类: B3_LINUX 2015-03-06 20:53 646人阅读 评论(0) 收藏
介绍性内容来自:http://www.uml.org.cn/sjjm/201305171.asp 一.Ganglia简介 Ganglia 是 UC Berkeley 发起的一个开源监视项目,设计用于测 ...
- php中模拟多继承如何实现
php中模拟多继承如何实现 一.总结 一句话总结:其实你继承别人也是想调用别人类里面的方法和属性,所以可以这样做:这本类中创建目标类的对象,然后通过这个对象来调用方法和属性,这样比继承来的方便. 二. ...
- 《SAS编程与数据挖掘商业案例》学习笔记之十二
本次重点在:sas数据集管理 主要包含:包含数据集纵向拼接.转置.排序.比較.复制.重命名.删除等 1.append语句 注:base数据集和data两个数据集必须结构一样.避免使用force的情况, ...
- sourceinsight4
转载 http://bbs.pediy.com/thread-215669.htm 如果你觉得软件有用,请购买正版.发布这个纯属娱乐. 转载请注明出处,谢谢! 仅修改了程序中用于License签名验证 ...