题意

题解

又是一道神仙题……

显然的做法是大力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)\).

代码

  1. #include<bits/stdc++.h>
  2. #define llong long long
  3. using namespace std;
  4. const int N = 1002;
  5. const int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
  6. char ch[N+3];
  7. char a[N*N+3];
  8. int li[N*N+3][4];
  9. int tag[N*N+3];
  10. int aux1[4][N+3],aux2[4][N+3];
  11. int n,q;
  12. int getid(int x,int y) {return x*(n+2)+y+1;}
  13. int getnxt(int u,int dir)
  14. {
  15. int ret = li[u][(dir-tag[u]+4)&3];
  16. for(int i=0; i<4; i++) {if(li[ret][i]==u) {tag[ret] = (dir-i+6)&3;}}
  17. return ret;
  18. }
  19. int main()
  20. {
  21. scanf("%d%d",&n,&q);
  22. for(int i=1; i<=n; i++) {scanf("%s",ch+1); for(int j=1; j<=n; j++) a[getid(i,j)] = ch[j];}
  23. for(int i=0; i<=n+1; i++)
  24. {
  25. for(int j=0; j<=n+1; j++)
  26. {
  27. int u = getid(i,j);
  28. for(int k=0; k<4; k++)
  29. {
  30. 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]);}
  31. }
  32. }
  33. }
  34. while(q--)
  35. {
  36. int x,y,l; scanf("%d%d%d",&x,&y,&l);
  37. int u = 1;
  38. for(int i=0; i<x; i++) u = getnxt(u,0);
  39. for(int i=0; i<y; i++) u = getnxt(u,1);
  40. for(int k=0; k<4; k++)
  41. {
  42. for(int i=0; i<l; i++)
  43. {
  44. aux1[k][i] = u; aux2[k][i] = getnxt(u,(k+3)&3);
  45. if(i<l-1) u = getnxt(u,k);
  46. }
  47. }
  48. for(int k=0; k<4; k++)
  49. {
  50. for(int i=0; i<l; i++)
  51. {
  52. li[aux1[k][i]][(k-tag[aux1[k][i]]+3)&3] = aux2[(k+1)&3][i];
  53. li[aux2[k][i]][(k-tag[aux2[k][i]]+5)&3] = aux1[(k+3)&3][i];
  54. }
  55. }
  56. }
  57. int u = 1;
  58. for(int i=1; i<=n; i++)
  59. {
  60. u = getnxt(u,0);
  61. int uu = u;
  62. for(int j=1; j<=n; j++) {uu = getnxt(uu,1); ch[j] = a[uu];/* printf("%d ",uu);*/}
  63. puts(ch+1);
  64. // puts("");
  65. }
  66. return 0;
  67. }

[JOI2012春季合宿]Rotate (链表)的更多相关文章

  1. BZOJ 4388 [JOI2012春季合宿]Invitation (线段树、二叉堆、最小生成树)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4388 题解 模拟Prim算法? 原题所述的过程就是Prim算法求最大生成树的过程.于是我 ...

  2. BZOJ 4221 [JOI2012春季合宿]Kangaroo (DP)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4221 题解 orz WYC 爆切神仙DP 首先将所有袋鼠按大小排序.考虑从前往后DP, ...

  3. [JOI2012春季合宿]Constellation (凸包)

    题意 题解 神仙结论题. 结论: 一个点集合法当且仅当其凸包上的两种颜色点分别连续. 证明: 必要性显然. 充分性: 考虑对于一个不同色三角形\(ABC\),不妨设点\(A\)为白点,点\(B,C\) ...

  4. UOJ356 [JOI2017春季合宿] Port Facility 【启发式合并】【堆】【并查集】

    题目分析: 好像跑得很快,似乎我是第一个启发式合并的. 把玩具看成区间.首先很显然如果有两个玩具的进出时间有$l1<l2<r1<r2$的关系,那么这两个玩具一定在不同的栈中间. 现在 ...

  5. [JOI2017春季合宿]Port Facility[set、二分图]

    题意 你有两个栈,有 \(n\) 个货物,每个货物有一个进栈时间和出栈时间(所有时间的并集是1~2n),问有多少种不同的入栈方案. \(n\le 10^6\) 分析 把每个货物的存在看成区间,相交的区 ...

  6. UOJ #356. 【JOI2017春季合宿】Port Facility

    Description 小M有两个本质不同的栈. 无聊的小M找来了n个玩具.之后小M把这n个玩具随机顺序加入某一个栈或把他们弹出. 现在小M告诉你每个玩具的入栈和出栈时间,现在她想考考小S,有多少种方 ...

  7. UOJ #357. 【JOI2017春季合宿】Sparklers

    Description 小S和小M去看花火大会. 一共有 n 个人按顺序排成一排,每个人手上有一个仅能被点燃一次的烟花.最开始时第 K 个人手上的烟花是点燃的. 烟花最多能燃烧 T 时间.每当两个人的 ...

  8. JOI2017 春季合宿:Railway Trip

    自己的AC做法似乎离正解偏了十万八千里而且复杂了不少--不管怎样还是记录下来吧. 题意: 题目链接: JOISC2017 F - AtCoder JOISC2017 F - LOJ \(N\)个车站排 ...

  9. UOJ356 【JOI2017春季合宿】Port Facility

    暴力就是O(n^2)连边,二分图,这样只有22分. 我们考虑优化建边,我们按照左端点排序,对于一个新加进来的线段,我们向左端点距其最近的和他相交的线段连边,别的相交的我们连同色边,当一个点连了两条同色 ...

随机推荐

  1. id和class的区别

    id和class是定义css样式用到的,不同的是定义样式时的写法不一样,使用id选择样式时,定义的格式为 #main{width:20px;} ,使用class时用到的是 .main{width:20 ...

  2. 解决MyEclipse发布按钮无效的办法

    删除Workspaces目录(存放您MyEclipse项目的地方)下的 “/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.genu ...

  3. Aveva Marine 新建项目001

    1# 项目代号定义,三个字符,例如Abc 2# 新建文件夹,命名为“Abc” 3# 新建文件名为evars.bat文件,放到项目文件夹的根目录 内容为: SET Abc000=项目文件夹路径\Abc0 ...

  4. mvc布局(一)

    negut添加Optimization @System.Web.Optimization.Styles.Render( "~/Content/styles/css/font-awesome. ...

  5. JS基础_if注意问题

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  6. mui APP 微信登录授权

    一.在微信平台上申请appid.appsecret. 二.app --> manifest.json-->SDK配置(填写申请好的appid和appsecret) 三.在登录页,点击微信登 ...

  7. 如果您的浏览器不支持javascript功能

    如果您的浏览器不支持javascript功能或被禁止使用,那么在访问许多网站(包括此网站)时,某些功能将不可用.我们建议您打开javascript功能以获得最佳的浏览效果.以下是打开它的可能原因和方法 ...

  8. element-ui中点击菜单,改变当前菜单背景颜色

    需求: vue项目中,点击左侧菜单,tags页显示当前打开的菜单,并且高亮显示当前菜单 实现效果: 实现代码:在vuex里面定义tags存放所有打开的菜单,和当前打开的索引curtagsIndex:, ...

  9. Tomcat面试题汇总

    详见:Tomcat 面试题汇总:https://blog.csdn.net/qq_25934401/article/details/81536958 1.Tomcat的缺省端口是多少,怎么修改? to ...

  10. RHEL6使用系统自带多路径软件配置多路径

    1.多路径的主要功能 多路径一般配合存储设备实现如下功能: 故障的切换和恢复  IO流量的负载均衡  磁盘的虚拟化     2.查看系统自带的多路径软件是否安装 [root@cluster01 ~]# ...