我觉得这道题的主旨应该是模拟,但是如果说他是二维链表的話也不為過。這道題的主體思路就是把原來旋轉點的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. 商城项目:商品列表ajax加载,ajax加入购物车--五张表的联合查询

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ProductLists.a ...

  2. rails中如何在a标签中添加其他标签

    最近在用rails写一个项目练练手,然后遇到了一个问题,就是用 <% link_to("首页", root_path) %> 生成一个a标签,之后就在想我怎么在这个a标 ...

  3. 014---Django的中间件

     前戏 我们在前面的课程中已经学会了给视图函数加装饰器来判断是用户是否登录,把没有登录的用户请求跳转到登录页面.我们通过给几个特定视图函数加装饰器实现了这个需求.但是以后添加的视图函数可能也需要加上装 ...

  4. P3305 [SDOI2013]费用流

    题目描述 Alice和Bob在图论课程上学习了最大流和最小费用最大流的相关知识. 最大流问题:给定一张有向图表示运输网络,一个源点S和一个汇点T,每条边都有最大流量. 一个合法的网络流方案必须满足: ...

  5. 牛客暑假多校第六场I-Team Rocket

    一.题意 我们是穿越银河的火箭队....... 给出若干个区间,之后给出若干个点,要求对每个点求出,第一个覆盖点的区间的数量,之后用当前所有点覆盖的区间的序号的乘积结合输入的Y来生成下一位点.最后输出 ...

  6. HDU暑假多校第三场H.Monster Hunter

    一.题意 给定一个树状地图,每个树节点上有一只怪物,打死一只怪物的过程中将会消耗A点HP,打死之后将会获得B点HP.因为树状结构,所以每只怪物必须先打死父节点的怪兽之后在打死子节点的怪物.现在,给定每 ...

  7. 转:C#微信公众号开发之接收事件推送与消息排重的方法

    本文实例讲述了C#微信公众号开发之接收事件推送与消息排重的方法.分享给大家供大家参考.具体分析如下: 微信服务器在5秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次.这样的话,问题就来了.有这 ...

  8. vs编译报错 BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

    1.重复释放内存导致,new delete和malloc free两个组合分配的堆空间都不能重复释放两次: 2.用delete或者free释放栈空间导致内存空间被破坏(栈空间内存的头部有系统写入的一些 ...

  9. 步骤2:JMeter 分布式测试(性能测试大并发、远程启动解决方案)

    转载(记录) http://www.cnblogs.com/fengpingfan/p/5583954.html http://www.cnblogs.com/puresoul/p/4844539.h ...

  10. 「个人训练」Can you solve this equation?(HDU-2199)

    题意与分析 纯粹水题.本来想做下放松心情的,结果还是被坑了qaq 重点就是在浮点误差.比较左右的下次就直接上1e-10,别看着题目说1e-4然后给个-5,结果暴wa.气傻了..... 代码 #incl ...