我觉得这道题的主旨应该是模拟,但是如果说他是二维链表的話也不為過。這道題的主體思路就是把原來旋轉點的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. Python接受流式输入

    随笔记录——Python接受终端入若干行输入 Python接受终端的若干行输入时,比较常用的input()不再好用. 1. 导入sys模块: import sys 2. for循环接受输入: for ...

  2. 数列分块入门 1 LOJ6277

    题目描述 给出一个长为 n 的数列,以及 n 个操作,操作涉及区间加法,单点查值. 输入格式 第一行输入一个数字 n. 第二行输入 n 个数字,第 iii 个数字为 a​i​​,以空格隔开. 接下来输 ...

  3. @Transactional spring 事务失效(转载)

    原文地址:http://hwak.iteye.com/blog/1611970 1. 在需要事务管理的地方加@Transactional 注解.@Transactional 注解可以被应用于接口定义和 ...

  4. java stream 处理分组后取每组最大

    有一个需求功能:先按照某一字段分组,再按照另外字段获取最大的那个 Map<String, HitRuleConfig> configMap = configList.parallelStr ...

  5. PHP.45-TP框架商城应用实例-后台20-权限管理-RBAC表构造与代码生成

    权限管理 三张主表{p39_privilege(权限).p39_role(角色).p39_admin(管理)} 两张中间表{p39_role_pri(角色-权限).p39_admin_role(管理- ...

  6. 机器学习sklearn的快速使用--周振洋

    ML神器:sklearn的快速使用 传统的机器学习任务从开始到建模的一般流程是:获取数据 -> 数据预处理 -> 训练建模 -> 模型评估 -> 预测,分类.本文我们将依据传统 ...

  7. pandas DataFrame的查询方法(loc,iloc,at,iat,ix的用法和区别)

    pandas DataFrame的增删查改总结系列文章: pandas DaFrame的创建方法 pandas DataFrame的查询方法 pandas DataFrame行或列的删除方法 pand ...

  8. BZOJ 4595 SHOI2015 激光发生器 射线,线段,偏转

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4595 题意概述: 给出一条射线和N条线段,射线遇到线段会发生反射,令入射角alpha,出射 ...

  9. java多线程二之线程同步的三种方法

          java多线程的难点是在:处理多个线程同步与并发运行时线程间的通信问题.java在处理线程同步时,常用方法有: 1.synchronized关键字. 2.Lock显示加锁. 3.信号量Se ...

  10. Java 端口扫描器 TCP的实现方法

    想必很多朋友都实现过一个简易的聊天室这个功能,其中涉及到Socket套接字这个类,我们通过一个特定的IP以及特定的端口创建一个服务端的套接字(ServerSocket),以此我们聊天个体的套接字(So ...