我觉得这道题的主旨应该是模拟,但是如果说他是二维链表的話也不為過。這道題的主體思路就是把原來旋轉點的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. laydate js动态添加时间

    $("#test2").click(function(){ var input=$('<input/>'); $("#test1").append( ...

  2. python3 练习题100例 (二十四)打印完数

    完数:一个数如果恰好等于它的因子之和,这个数就称为"完数".例如 6 = 1+2+3. 题目内容: 输入一个正整数n(n<1000),输出1到n之间的所有完数(包括n). 输 ...

  3. 网站漏洞修复之最新版本UEditor漏洞

    UEditor于近日被曝出高危漏洞,包括目前官方UEditor 1.4.3.3 最新版本,都受到此漏洞的影响,ueditor是百度官方技术团队开发的一套前端编辑器,可以上传图片,写文字,支持自定义的h ...

  4. haproxy + keepalived 实现高可用负载均衡集群

    1. 首先准备两台tomcat机器,作为集群的单点server. 第一台: 1)tomcat,需要Java的支持,所以同样要安装Java环境. 安装非常简单. tar xf  jdk-7u65-lin ...

  5. C语言实例解析精粹学习笔记——43(希尔排序)

    实例说明: 用希尔排序方法对数组进行排序.由于书中更关注的实例,对于原理来说有一定的解释,但是对于第一次接触的人来说可能略微有些简略.自己在草稿纸上画了好久,后来发现网上有好多很漂亮的原理图. 下面将 ...

  6. 004---Python基本数据类型--元祖

    元祖 .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px ...

  7. Python3爬虫(三)请求库的使用之urllib

    Infi-chu: http://www.cnblogs.com/Infi-chu/ 一.urllib库: 1. 是Python内置的HTTP请求库 2. 在Python2中,由urllib和urll ...

  8. 【转】Django添加静态文件设置

    STATIC_URL = '/statics/'STATIC_ROOT= os.path.join(BASE_DIR, 'statics')STATICFILES_DIRS = ( os.path.j ...

  9. Linux下Expect 完成自动输入密码

    今天要开发一个定时任务,然后加入cron列表中.但是有个问题摆在眼前,脚本的执行中需要输入数据库密码(貌似5.1版本以上不允许在-p后直接加密码,会报错) mysql -u root -p <& ...

  10. How to enable download EXE files from the Sharepoint website

          As we all know,many applications have forbidden to upload and download exe files.Because the e ...