题目是中文的我就不是说明了,比赛的时候看过题目后队友说是splay来做,细想来省赛不会出这么坑的题目吧。

于是比赛还有一个小时左右把该做的都做完了以后,我们队三个人都来思考这个题目了。不过还好很快我们就跳过了这个splay的坑。

因为这个题目根本不是spaly,直接用数组模拟链表就行了,所有的操作都可以再O(1)的时间复杂度以内搞定。

可以这样做,首先对于每一个数,我们都可以视为一个节点,然后一条链的话就相当于是指针操作了,每个节点都设置两个指针——前驱和后继。

设置后继节点是为了应对4操作,因为全部取反只要交换后继和前驱就可以了(其实不用交换也行,只要记录总共要交换多少次就行了,因为换两次就换回来了哦)

对于1、2、3就是简单的链表操作了,不过注意3操作有一个坑,就是x和y可能是相邻的两个节点哦,特别注意了,这里有点坑的。

不过说了,上代码,这个题目时间虽然是O(n),但是时间还不算宽哦,所以写的时候还是注意一下比较好。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #define maxn 1001000
  5. #define ll long long
  6. using namespace std;
  7.  
  8. int next[maxn],pre[maxn],n,m,k,tim;
  9. int *tep,*tep2;
  10.  
  11. void init_next_pre()
  12. {
  13. for (int i=; i<=n; i++) next[i]=i+,pre[i]=i-;
  14. next[n]=;
  15. }
  16.  
  17. void dele(int x)
  18. {
  19. int k1=pre[x],k2=next[x];
  20. next[k1]=k2,pre[k2]=k1;
  21. }
  22.  
  23. void insert(int k1,int mid,int k2)
  24. {
  25. next[k1]=mid,next[mid]=k2;
  26. pre[k2]=mid,pre[mid]=k1;
  27. }
  28.  
  29. void SWAP(int x,int y)
  30. {
  31. int k1=pre[x],k2=next[x],k3=pre[y],k4=next[y];
  32. if (k2==y)//考虑xy相邻的情况
  33. {
  34. next[k1]=y,next[y]=x,next[x]=k4;
  35. pre[k4]=x,pre[x]=y,pre[y]=k1;
  36. }
  37. else if (k4==x)//考虑xy相邻的情况
  38. {
  39. next[k3]=x,next[x]=y,next[y]=k2;
  40. pre[k2]=y,pre[y]=x,pre[x]=k3;
  41. }
  42. else
  43. {
  44. next[k1]=y,next[y]=k2,pre[y]=k1,pre[k2]=y;
  45. next[k3]=x,next[x]=k4,pre[x]=k3,pre[k4]=x;
  46. }
  47. }
  48.  
  49. int main()
  50. {
  51. int cod,x,y,cas=;
  52. while (cin>>n>>m)
  53. {
  54. tim=;
  55. init_next_pre();
  56. while (m--)
  57. {
  58. cin>>cod;
  59. if (cod==) tim++;//这里只要记录首位交换了多少次哦
  60. else
  61. {
  62. cin>>x>>y;
  63. if (cod< && tim&) cod=-cod;//如果交换了奇数次,那么本来应该插在前面就相当于是现在应该插在后面,T_T不好怎么表达,自己理解一下就懂了。
  64. if (cod==)
  65. {
  66. dele(x);
  67. k=pre[y];
  68. insert(k,x,y);
  69. }
  70. else if (cod==)
  71. {
  72. dele(x);
  73. k=next[y];
  74. insert(y,x,k);
  75. }
  76. else if (cod==) SWAP(x,y);
  77. }
  78. }
  79. if (tim&) tep=pre,tep2=next; else tep=next,tep2=pre;
  80. for (int i=; i<=n; i++)
  81. {
  82. if (tep2[i]==)
  83. {
  84. ll ans=;
  85. for (int k=; i; i=tep[i],k++) if (k&) ans+=i;
  86. cout<<"Case "<<++cas<<": "<<ans<<endl;
  87. break;
  88. }
  89. }
  90. }
  91. return ;
  92. }

CSUOJ1329——一行盒子_湖南省第九届大学生计算机程序设计竞赛的更多相关文章

  1. 湖南省第九届大学生计算机程序设计竞赛 Interesting Calculator

    Interesting Calculator Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 163  Solved: 49 Description T ...

  2. 湖南省第十三届大学生计算机程序设计竞赛 Football Training Camp 贪心

    2007: Football Training Camp[原创-转载请说明] Submit Page   Summary   Time Limit: 1 Sec     Memory Limit: 1 ...

  3. 2018湖南省第14届大学生计算机程序设计竞赛 D: 卖萌表情

    Description 已知以下 4 种都是卖萌表情(空白的部分可以是任意字符.竖线是便于展示的分隔符,没有实际意义): ^ ^ | ^ | < | > v | v v | > | ...

  4. 2018湖南省第14届大学生计算机程序设计竞赛 C: 时间旅行

    Description 假设 Bobo 位于时间轴(数轴)上 t0 点,他要使用时间机器回到区间 (0, h] 中. 当 Bobo 位于时间轴上 t 点,同时时间机器有 c 单位燃料时,他可以选择一个 ...

  5. 2018湖南省第14届大学生计算机程序设计竞赛 A字符画

    Description 读入 w,请输出 2018 的字符画,两个数字之间有 w 个空格.具体格式请参考样例输出. 1 ≤ w ≤ 2018 Input 输入文件只包含 1 个整数 w. Output ...

  6. 希尔加密算法(湖南师范大学第六届大学生计算机程序设计竞赛)hnuoj11552

    解密 Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit users: 2, Accept ...

  7. csu 1503: 点弧之间的距离-湖南省第十届大学生计算机程序设计大赛

    这是--比量p并用交点连接中心不上弧.在于:它至p距离.是不是p与端点之间的最短距离 #include<iostream> #include<map> #include< ...

  8. 2019年湖南省大学生计算机程序设计竞赛 (HNCPC2019) 简要题解

    2019年湖南省大学生计算机程序设计竞赛 (HNCPC2019) 简要题解 update10.01 突然发现叉姐把这场的题传到牛客上了,现在大家可以有地方提交了呢. 不知道该干什么所以就来水一篇题解 ...

  9. 2016年湖南省第十二届大学生计算机程序设计竞赛---Parenthesis(线段树求区间最值)

    原题链接 http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1809 Description Bobo has a balanced parenthes ...

随机推荐

  1. 【BZOJ4566】[HAOI2016]找相同字符

    [BZOJ4566][HAOI2016]找相同字符 题面 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两个子串中有一个位置不同. 其中\(1\le ...

  2. scala : 类型与类

    scala类型系统:1) 类型与类 在Java里,一直到jdk1.5之前,我们说一个对象的类型(type),都与它的class是一一映射的,通过获取它们的class对象,比如 String.class ...

  3. 解析build.gradle文件

    Gradle是一个非常先进的项目构建工具,它使用了一种基于Groovy的领域特定语言DSL来声明项目设置,摒弃了传统XML(如Ant和Maven)的各种繁琐配置 项目结构如上图: 1.最外层目录下的b ...

  4. Springboot 配置实现定时任务

    善于思考,拥抱变化,才能拥有未来 在springboot项目中可以通过配置文件来实现定时任务的轮询,当然也可以将具体执行的corn表达式配置到数据库,实现动态从数据库获取. @Configuratio ...

  5. cookie,session傻傻分不清楚?

    做了这么多年测试,还是分不清什么是cookie,什么是session?很正常,很多初级开发工程师可能到现在都搞不清什么是session,cookie相对来说会简单很多. 下面这篇文章希望能够帮助大家分 ...

  6. jenkens其实是代码上传工具

    Jenkins 持续集成使用教程 用 jenkins 有什么好处 通过规范化来完成,简单,繁琐,浪费时间的重复工作 规范化工作,以免出现低级错误 实现随时随地任何人一键构建 ...... 安装 jen ...

  7. Unity Lighting - Emissive Materials 自发光材质(九)

      Emissive Materials 自发光材质 Whilst Area Lights are not supported by Precomputed Realtime GI, similar ...

  8. html5shiv 是一个针对 IE 浏览器的 HTML5 JavaScript 补丁,目的是让 IE 识别并支持 HTML5 元素。

    html5shiv 是一个针对 IE 浏览器的 HTML5 JavaScript 补丁,目的是让 IE 识别并支持 HTML5 元素. 各版本html5shiv.js CDN网址:https://ww ...

  9. leetcode- 将有序数组转换为二叉搜索树(java)

    将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组: [-10,-3,0, ...

  10. Zabbix自动发现之fping

    原文发表于cu:2016-06-21 Zabbix自动发现功能从配置流程上比较简单:Discovery与Action. 在做Zabbix的自动发现验证时,使用"ICMP ping" ...