我觉得这道题的主旨应该是模拟,但是如果说他是二维链表的話也不為過。這道題的主體思路就是把原來旋轉點的O(n^2)變成了旋轉邊界的O(n)。怎麼旋轉邊界呢,就好像是把原來的那些點都於上下左右四個點連線,形成一個大網,我們要做的就是把要旋轉的正方形的四周的線都剪斷,然後轉一下再練上,實現的話就是二維點化一維點,所有的點自由化,然後每次找正方形從一個邊界點開始走進去走出來他的邊界,這裡只要注意記錄真實方向即可(只要能即時獲得即可)。

思路固然重要,簡潔高效的代碼實現同樣重要,代碼實現同樣需要注入思考。

#pragma GCC optimize("O3")
#include <cstdio>
#define shang(a) (p[(a)].t[p[(a)].f])
#define xia(a) (p[(a)].t[(p[(a)].f+2)%4])
#define zuo(a) (p[(a)].t[(p[(a)].f+1)%4])
#define you(a) (p[(a)].t[(p[(a)].f+3)%4])
inline void read(int &sum){
register char ch=getchar();
for(sum=;ch<''||ch>'';ch=getchar());
for(;ch>=''&&ch<='';sum=(sum<<)+(sum<<)+ch-'',ch=getchar());
}
const int N=;
struct Point{
int t[],f,v;
}p[N*N];
int hash[N][N],sz;
int n,m,q,tb[N],pg[N],zs[N],ys[N];
inline int toward(int x,int y){
for(int i=;i<;++i)
if(p[x].t[i]==y)
return i;
}
inline void get_fs(int x,int y){
int j=toward(y,x);
if(j==)p[y].f=;
else if(j==)p[y].f=;
else if(j==)p[y].f=;
else p[y].f=;
}
inline void get_fx(int x,int y){
int j=toward(y,x);
if(j==)p[y].f=;
else if(j==)p[y].f=;
else if(j==)p[y].f=;
else p[y].f=;
}
inline void get_fz(int x,int y){
int j=toward(y,x);
if(j==)p[y].f=;
else if(j==)p[y].f=;
else if(j==)p[y].f=;
else p[y].f=;
}
inline void get_fy(int x,int y){
int j=toward(y,x);
if(j==)p[y].f=;
else if(j==)p[y].f=;
else if(j==)p[y].f=;
else p[y].f=;
}
inline void print(){
for(int i=,now;i<=n;++i){
now=hash[i][];
for(int j=;j<=m;++j)
get_fy(now,you(now)),now=you(now),printf("%d ",p[now].v);
puts("");
}
}
inline void read_pre(){
read(n),read(m),read(q);
for(int i=;i<=n+;++i)
for(int j=;j<=m+;++j)
hash[i][j]=++sz;
for(int i=;i<=n;++i)
for(int j=;j<=m;++j)
read(p[hash[i][j]].v),
p[hash[i][j]].t[]=hash[i-][j],
p[hash[i][j]].t[]=hash[i+][j],
p[hash[i][j]].t[]=hash[i][j-],
p[hash[i][j]].t[]=hash[i][j+];
for(int i=;i<=n;++i)
p[hash[i][]].t[]=hash[i-][],
p[hash[i][]].t[]=hash[i+][],
p[hash[i][]].t[]=hash[i][],
p[hash[i][m+]].t[]=hash[i-][m+],
p[hash[i][m+]].t[]=hash[i+][m+],
p[hash[i][m+]].t[]=hash[i][m];
for(int i=;i<=m;++i)
p[hash[][i]].t[]=hash[][i-],
p[hash[][i]].t[]=hash[][i+],
p[hash[][i]].t[]=hash[][i],
p[hash[n+][i]].t[]=hash[n+][i-],
p[hash[n+][i]].t[]=hash[n+][i+],
p[hash[n+][i]].t[]=hash[n][i];
p[hash[][]].t[]=hash[][],
p[hash[][]].t[]=hash[][],
p[hash[][m+]].t[]=hash[][m],
p[hash[][m+]].t[]=hash[][m+],
p[hash[n+][]].t[]=hash[n][],
p[hash[n+][]].t[]=hash[n+][],
p[hash[n+][m+]].t[]=hash[n][m+],
p[hash[n+][m+]].t[]=hash[n+][m];
}
inline void work(){
int x,y,l,now;
while(q--){
read(x),read(y),read(l);
if(l==)continue;
int now=hash[x][];
for(int i=;i<=y;++i)
get_fy(now,you(now)),now=you(now);
zs[]=now;
for(int i=;i<=l;++i)
get_fx(now,xia(now)),now=xia(now),zs[i]=now;
for(int j=;j<l;++j)
get_fy(now,you(now)),now=you(now),pg[j]=now;
get_fy(now,you(now)),now=you(now),ys[]=now;
for(int i=;i<=l;++i)
get_fs(now,shang(now)),now=shang(now),ys[i]=now;
for(int j=;j<l;++j)
get_fz(now,zuo(now)),now=zuo(now),tb[j]=now;
for(int i=;i<l;++i)
get_fs(tb[i],shang(tb[i])),xia(shang(tb[i]))=zs[i],
get_fy(ys[i],you(ys[i])),zuo(you(ys[i]))=tb[i],
get_fx(pg[i],xia(pg[i])),shang(xia(pg[i]))=ys[i],
get_fz(zs[i],zuo(zs[i])),you(zuo(zs[i]))=pg[i];
for(int i=,temp;i<l;++i)
temp=zuo(zs[i]),
zuo(zs[i])=shang(tb[i]),
shang(tb[i])=you(ys[i]),
you(ys[i])=xia(pg[i]),
xia(pg[i])=temp;
get_fz(zs[],zuo(zs[])),you(zuo(zs[]))=zs[l],
get_fs(zs[],shang(zs[])),xia(shang(zs[]))=zs[l],
get_fy(ys[l],you(ys[l])),zuo(you(ys[l]))=zs[],
get_fs(ys[l],shang(ys[l])),xia(shang(ys[l]))=zs[],
get_fy(ys[],you(ys[])),zuo(you(ys[]))=ys[l],
get_fx(ys[],xia(ys[])),shang(xia(ys[]))=ys[l],
get_fz(zs[l],zuo(zs[l])),you(zuo(zs[l]))=ys[],
get_fx(zs[l],xia(zs[l])),shang(xia(zs[l]))=ys[];
int temp=shang(zs[]);
shang(zs[])=you(ys[l]),
you(ys[l])=xia(ys[]),
xia(ys[])=zuo(zs[l]),
zuo(zs[l])=temp;
temp=zuo(zs[]),
zuo(zs[])=shang(ys[l]),
shang(ys[l])=you(ys[]),
you(ys[])=xia(zs[l]),
xia(zs[l])=temp;
}
}
int main(){
read_pre(),work(),print();
return ;
}

【NOIP模拟赛】Drink 二维链表+模拟的更多相关文章

  1. 6.6 省选模拟赛 线段 二维数点问题 树套树 CDQ分治

    LINK:线段 还是太菜了 没看出这道题真正的模型 我真是一个典型的没脑子选手. 考虑如何查询答案. 每次在一个线段x的状态被更改后 可以发现有影响的是 和x相连那段极长连续1子段. 设这个子段左端点 ...

  2. PHP操作 二维数组模拟mysql函数

    PHP操作 二维数组模拟mysql函数<pre>public function monimysqltest(){ $testarray=array( array('ss'=>'1', ...

  3. NOIP2018 模拟赛(二十二)雅礼NOI

    Preface 这次的题目都是NOI+的题,所以大家的分数都有点惨烈. 依靠T1大力骗分水到Rank2 所以想看正解的话看这里吧 A. 「雅礼NOI2018模拟赛(一) Day1」树 看一眼题目感觉十 ...

  4. SDUT OJ 图练习-BFS-从起点到目标点的最短步数 (vector二维数组模拟邻接表+bfs , *【模板】 )

    图练习-BFS-从起点到目标点的最短步数 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 在古老的魔兽传说中,有两个军团,一个叫天 ...

  5. 【HHHOJ】NOIP2018 模拟赛(二十四) 解题报告

    点此进入比赛 得分: \(100+60+100\)(挺好的,涨了一波\(Rating\)) 排名: \(Rank\ 1\) \(Rating\):\(+115\) \(T1\):[HHHOJ13]金( ...

  6. 【Nowcoder 上海五校赛】二数(模拟)

    题目描述: 我们把十进制下每一位都是偶数的数字叫做“二数”. 小埃表示自己很聪明,最近他不仅能够从小数到大:2,3,4,5....,也学会了从大数到小:100,99,98...,他想知道从一个数开始数 ...

  7. codeup模拟赛 进击的二叉查找数

    问题 B: 进击的二叉查找树 时间限制: 1 Sec 内存限制: 64 MB 提交: 1017 解决: 379 提交状态 题目描述 给定1~N的两个排列,使用这两个排列分别构建两棵二叉查找树(也就是通 ...

  8. 二维数组模拟实现酒店管理系统-java

    业务分析 1.需要一个房间类,包含房间的属性,比如房间编号.房间类型.是否占用. 2.需要一个旅馆类,旅馆有房间,提供的方法需要有 预订房间.打印房间信息.初始化房间.退房. 3.测试类,测试预订房间 ...

  9. EZ 2018 06 24 NOIP2018 模拟赛(二十)

    很久之前写的一套题了,由于今天的时间太多了,所以记起来就写掉算了. 这一场尽管T2写炸了,但也莫名Rank4涨了Rating.不过还是自己太菜. A. 环游世界 首先我们先排个序,想一下如果不用走回来 ...

随机推荐

  1. jquery easyui alert闪一下的问题

    最近做项目使用了 jQuery EasyUI,版本是 1.4.3.x,在使用alert方法的时候如果alert后面执行页面跳转的话alert的消息只会闪一下,就跳到其他页面了 $.messager.a ...

  2. JavaSE 第二次学习随笔(三)

    * 常见异常 * 数组越界异常 * 空指针异常 * * * 特点: 当程序出现异常的时候, 程序会打印异常信息并中断程序 * 所以当同时出现多个异常的时候只能执行第一个, 后边的用不到 * * 单异常 ...

  3. struts2架构网站漏洞修复详情与利用漏洞修复方案

    struts2从开发出来到现在,很多互联网企业,公司,平台都在使用apache struts2系统来开发网站,以及应用系统,这几年来因为使用较多,被攻击者挖掘出来的struts2漏洞也越来越,从最一开 ...

  4. DedeCMS V5.7sp2最新版本parse_str函数SQL注入漏洞

    织梦dedecms,在整个互联网中许多企业网站,个人网站,优化网站都在使用dede作为整个网站的开发架构,dedecms采用php+mysql数据库的架构来承载整个网站的运行与用户的访问,首页以及栏目 ...

  5. Java学习笔记二:Java开发工具Eclipse的安装与使用

    Java开发工具Eclipse的安装与使用 正如office一样我们在开发java语言过程中同样需要依款不错的开发工具,目前市场上的IDE很多,这里只演示Eclipse的安装: 一:下载软件: 1.下 ...

  6. unity独立游戏开发日志2018/09/22

    f::很头痛之前rm做的游戏在新电脑工程打不开了...只能另起炉灶... 还不知道新游戏叫什么名...暂且叫方块世界.(素材已经授权) 首先是规划下场景和素材文件夹的建立. unity常用的文件夹有: ...

  7. LeetCode 二叉树的层次遍历 C++

    给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回其层 ...

  8. go学习笔记-Data类型(Arrays, Slices and Maps)

    Data类型(Arrays, Slices and Maps) array array就是数组,定义方式如下: var arr [n]type 在[n]type中,n表示数组的长度,type表示存储元 ...

  9. PHP.39-扩展-锁机制解决并发-MySQL锁、PHP文件锁

    锁机制适用于高并发场景:高并发订单.秒杀…… apache压力测试 Mysql锁详解 语法 加锁:LOCK TABLE 表名1 READ|WRITE, 表名2 READ|WRITE ......... ...

  10. SLAM中的常识与经验

    双目矫正 双目通常事先是通过畸变矫正标定的,而RGB-D和单目则并不一定完成了矫正. 因此,对于RGB-D和单目获取的图像,在提取特征点之后,需要矫正,而双目则可以省略这一过程. 词袋模型反向索引 D ...