[JOI2012春季合宿]Rotate (链表)
题意


题解
又是一道神仙题……
显然的做法是大力splay,时间复杂度\(O((N+Q)N\log N)\), 可以卡掉。
正解: 使用十字链表维护矩阵,在周围增加第\(0\)行/列和第\((n+1)\)行/列,设\(li[x][d]\)表示\(x\)这个点在\(d\)这个方向上的下一个元素的编号是什么(一开始给每个元素都编上号)。那么对于一次旋转,子矩形边界上的格子暴力修改,内部相当于把\(4\)个方向做了个轮换,因此可以打标记实现。
然而本题的实现方法比较神奇: 每次修改从\((0,0)\)走到\((x,y)\) (只花费\(O(N)\)的时间),首先\((0,0)\)的标记一定是正确的(因为没有修改过),然后一路上通过当前点和下一个点互相储存位置的偏移量以及当前点的正确标记确定下一个点的正确标记。(详见代码,我的代码里标记的含义是实际方向等于存储方向加标记)
时间复杂度\(O((N+Q)N)\).
代码
#include<bits/stdc++.h>
#define llong long long
using namespace std;
const int N = 1002;
const int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
char ch[N+3];
char a[N*N+3];
int li[N*N+3][4];
int tag[N*N+3];
int aux1[4][N+3],aux2[4][N+3];
int n,q;
int getid(int x,int y) {return x*(n+2)+y+1;}
int getnxt(int u,int dir)
{
int ret = li[u][(dir-tag[u]+4)&3];
for(int i=0; i<4; i++) {if(li[ret][i]==u) {tag[ret] = (dir-i+6)&3;}}
return ret;
}
int main()
{
scanf("%d%d",&n,&q);
for(int i=1; i<=n; i++) {scanf("%s",ch+1); for(int j=1; j<=n; j++) a[getid(i,j)] = ch[j];}
for(int i=0; i<=n+1; i++)
{
for(int j=0; j<=n+1; j++)
{
int u = getid(i,j);
for(int k=0; k<4; k++)
{
if(i+dx[k]>=0&&i+dx[k]<=n+1&&j+dy[k]>=0&&j+dy[k]<=n+1) {li[u][k] = getid(i+dx[k],j+dy[k]);}
}
}
}
while(q--)
{
int x,y,l; scanf("%d%d%d",&x,&y,&l);
int u = 1;
for(int i=0; i<x; i++) u = getnxt(u,0);
for(int i=0; i<y; i++) u = getnxt(u,1);
for(int k=0; k<4; k++)
{
for(int i=0; i<l; i++)
{
aux1[k][i] = u; aux2[k][i] = getnxt(u,(k+3)&3);
if(i<l-1) u = getnxt(u,k);
}
}
for(int k=0; k<4; k++)
{
for(int i=0; i<l; i++)
{
li[aux1[k][i]][(k-tag[aux1[k][i]]+3)&3] = aux2[(k+1)&3][i];
li[aux2[k][i]][(k-tag[aux2[k][i]]+5)&3] = aux1[(k+3)&3][i];
}
}
}
int u = 1;
for(int i=1; i<=n; i++)
{
u = getnxt(u,0);
int uu = u;
for(int j=1; j<=n; j++) {uu = getnxt(uu,1); ch[j] = a[uu];/* printf("%d ",uu);*/}
puts(ch+1);
// puts("");
}
return 0;
}
[JOI2012春季合宿]Rotate (链表)的更多相关文章
- BZOJ 4388 [JOI2012春季合宿]Invitation (线段树、二叉堆、最小生成树)
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4388 题解 模拟Prim算法? 原题所述的过程就是Prim算法求最大生成树的过程.于是我 ...
- BZOJ 4221 [JOI2012春季合宿]Kangaroo (DP)
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4221 题解 orz WYC 爆切神仙DP 首先将所有袋鼠按大小排序.考虑从前往后DP, ...
- [JOI2012春季合宿]Constellation (凸包)
题意 题解 神仙结论题. 结论: 一个点集合法当且仅当其凸包上的两种颜色点分别连续. 证明: 必要性显然. 充分性: 考虑对于一个不同色三角形\(ABC\),不妨设点\(A\)为白点,点\(B,C\) ...
- UOJ356 [JOI2017春季合宿] Port Facility 【启发式合并】【堆】【并查集】
题目分析: 好像跑得很快,似乎我是第一个启发式合并的. 把玩具看成区间.首先很显然如果有两个玩具的进出时间有$l1<l2<r1<r2$的关系,那么这两个玩具一定在不同的栈中间. 现在 ...
- [JOI2017春季合宿]Port Facility[set、二分图]
题意 你有两个栈,有 \(n\) 个货物,每个货物有一个进栈时间和出栈时间(所有时间的并集是1~2n),问有多少种不同的入栈方案. \(n\le 10^6\) 分析 把每个货物的存在看成区间,相交的区 ...
- UOJ #356. 【JOI2017春季合宿】Port Facility
Description 小M有两个本质不同的栈. 无聊的小M找来了n个玩具.之后小M把这n个玩具随机顺序加入某一个栈或把他们弹出. 现在小M告诉你每个玩具的入栈和出栈时间,现在她想考考小S,有多少种方 ...
- UOJ #357. 【JOI2017春季合宿】Sparklers
Description 小S和小M去看花火大会. 一共有 n 个人按顺序排成一排,每个人手上有一个仅能被点燃一次的烟花.最开始时第 K 个人手上的烟花是点燃的. 烟花最多能燃烧 T 时间.每当两个人的 ...
- JOI2017 春季合宿:Railway Trip
自己的AC做法似乎离正解偏了十万八千里而且复杂了不少--不管怎样还是记录下来吧. 题意: 题目链接: JOISC2017 F - AtCoder JOISC2017 F - LOJ \(N\)个车站排 ...
- UOJ356 【JOI2017春季合宿】Port Facility
暴力就是O(n^2)连边,二分图,这样只有22分. 我们考虑优化建边,我们按照左端点排序,对于一个新加进来的线段,我们向左端点距其最近的和他相交的线段连边,别的相交的我们连同色边,当一个点连了两条同色 ...
随机推荐
- 怎样使用 v-if 实现 html 元素的显示 / 隐藏?
1. 首先, 指令后的引号内是可以写 js 表达式的, 这点很重要. v-if 的用法很简单, 只需要给 v-if = " " 的引号内放一个 布尔值 即可. 注意: v-if 的 ...
- webpack自定义loader并发布
一.官网对loader的解释: 1.loader 是导出为一个函数的 node 模块.该函数在 loader 转换资源的时候调用.给定的函数将调用 loader API,并通过 this 上下文访问. ...
- HDU3085NightmareII题解--双向BFS
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=3085 分析 大意就是一个男孩和一个女孩在网格里,同时还有两个鬼,男孩每轮走三步,女孩每轮走一步,与鬼曼 ...
- linux mint ubuntu 安装qq
git clone https://gitee.com/wszqkzqk/deepin-wine-for-ubuntu.gitcd deepin-wine-for-ubuntu./install.sh ...
- 帝国cms 修改分页样式
帝国cms 修改分页样式(路径) /e/class/t_functions.php
- vscode调试npm包技巧
官网文档:https://code.visualstudio.com/docs/nodejs/nodejs-debugging node调试方法(日志和debuuger):https://blog.r ...
- 分布式缓存系统 Memcached 快速入门
Memcached介绍 官网地址 Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提 ...
- 使用PyQt5自制文件查找工具,并生成EXE文件
一.工作中,有一个关键词查找工作,查找开发版本中使用的文本,有哪些词语是非法的,一个一个去查太累了,所以想到了用代码来实现.可后来想想,能否做成简单的小工具,大家都可以使用. 于是就着手编写工具.原来 ...
- Datasnap 获取客户端IP
uses Data.DBXTransport; //ServerContainer procedure TServerContainer.DSServer1Connect(DSConnectEvent ...
- php实现雪花算法(ID递增)
雪花算法简单描述: 最高位是符号位,始终为0,不可用. 41位的时间序列,精确到毫秒级,41位的长度可以使用69年.时间位还有一个很重要的作用是可以根据时间进行排序. 10位的机器标识,10位的长度最 ...