我觉得这道题的主旨应该是模拟,但是如果说他是二维链表的話也不為過。這道題的主體思路就是把原來旋轉點的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. scala成长之路(3)隐式转换

    不废话,先上例子:定义一个参数类型为String的函数: scala> def sayHello(name:String) = println("hello " + name ...

  2. clear()、sync()、ignore()

    #include <iostream> using namespace std; int main() { int a; cin>>a; cout<<cin.rds ...

  3. xssbypass小记

    简单整理下bypass的一些点 标签外 如果是标签之外 又有htmlspecialchars函数的点 就别想了 在标签外同时能xss但是有长度限制 如果是储存型可以利用多个点 然后构造<scri ...

  4. WPF中InkCanvas(墨水面板)用法

    原文:WPF中InkCanvas(墨水面板)用法   WPF中InkCanvas(墨水面板)用法                                                    ...

  5. 虚拟现实-VR-UE4-编译源代码后,无法运行

    情况是这个样,在一开始我编译后,是可以运行,但是当我重新做系统后,再次运行时,每次都是到加载的18%的时候提示了如下错误 具体解决方法还没有找到,正在努力找中.........,会后续更新 同时希望有 ...

  6. 第七篇Python基本数据类型之数字&字符串&布尔值

    数字 写在最前,必须要会的:int() 整型 Python3里无论数字多长都用int表示,Python2里有int和Long表示,Long表示长整型 有关数字的常用方法,方法调用后面都必须带括号() ...

  7. 《python机器学习—预测分析核心算法》:构建预测模型的一般流程

    参见原书1.5节 构建预测模型的一般流程 问题的日常语言表述->问题的数学语言重述重述问题.提取特征.训练算法.评估算法 熟悉不同算法的输入数据结构:1.提取或组合预测所需的特征2.设定训练目标 ...

  8. Annoy解析

    Annoy是高维空间求近似最近邻的一个开源库. Annoy构建一棵二叉树,查询时间为O(logn). Annoy通过随机挑选两个点,并使用垂直于这个点的等距离超平面将集合划分为两部分. 如图所示,图中 ...

  9. Visual Studio 2012安装包

    点击下载

  10. LeetCode 3——无重复字符的最长子串

    1. 题目 2. 解答 2.1. 方法一 我们从前往后遍历字符串,start 代表最长子串的起始位置,一开始设置为零. 如果没有遇到重复字符,则更新子串的长度,向后遍历. 如果遇到重复字符时,则更新字 ...