Description

最近小M买了一个移动硬盘来储存自己电脑里不常用的文件。但是他把这些文件一股脑丢进移动硬盘后,觉得这些文件似乎没有被很好地归类,这样以后找起来岂不是会非常麻烦?
小M最终决定要把这些文件好好归类,把同一类地移动到一起。所以现在小M有了这几种操作:
1 u 表示把编号为u的文件放到最上面
2 u 表示把编号为u的文件放到最下面
3 u v 表示把编号为u的文件放到编号为v的文件的后面
已知在最开始的时候,1号文件到n号文件从上往下排布
现在小M已经给出了他所进行的所有操作,你能告诉他操作之后的序列是会变成什么样子吗?

Input

第一行为一个数字T(T<=10)表示数据组数
第二行为两个数字n、m(1<=n,m<=300000)表示序列长度和小M的操作次数
接下来m行每行两个或三个数字,具体含义见题面
保证数据合法

Output

输出一行表示小M操作结束后的序列

Sample Input

  1. 1
  2. 10 5
  3. 1 5
  4. 2 3
  5. 2 6
  6. 3 4 8
  7. 3 1 3

Sample Output

  1. 5 2 7 8 4 9 10 3 1 6

Hint

这道题之前见过好几次,没有一次写出来过,前几天认真研究了一下,终于写出来了。
思路:对每个位置,用l 和r两个数组记录该位置前面和后面的数的编号,每次变动的时候更新一下就好了。
  1. #include<stdio.h>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<string.h>
  5. using namespace std;
  6. #define MAXN 300010
  7. typedef long long ll;
  8. int m, n;
  9. int l[MAXN], r[MAXN];
  10. void init()
  11. {
  12. r[0] = 1;
  13. l[n + 1] = n;
  14. for (int i = 1; i <= n; i++)
  15. {
  16. l[i] = i - 1;
  17. r[i] = i + 1;
  18. }
  19. }
  20. void con(int x, int y)
  21. {
  22. r[x] = y;
  23. l[y] = x;
  24. }
  25. int main()
  26. {
  27. int T,x,u,v;
  28. while (cin >> T)
  29. {
  30. while (T--)
  31. {
  32. cin >> n >> m;
  33. init();
  34. for (int i = 0; i < m; i++)
  35. {
  36. cin >> x;
  37. if (x == 1)
  38. {
  39. cin >> u;
  40. if (r[0] == u)
  41. continue;
  42. int l_u = l[u],r_u=r[u],r0=r[0];
  43. con(l_u, r_u);
  44. con(u, r0);
  45. con(0, u);
  46. }
  47. else if (x == 2)
  48. {
  49. cin >> u;
  50. if (l[n+1] == u)
  51. continue;
  52. int l_u = l[u], r_u = r[u], l_n = l[n+1];
  53. con(l_u, r_u);
  54. con(l_n, u);
  55. con(u, n+1);
  56. }
  57. else
  58. {
  59. cin >> u >> v;
  60. if (r[v] == u)
  61. continue;
  62. int l_u = l[u], r_u = r[u], r_v = r[v];
  63. con(l_u, r_u);
  64. con(u, r_v);
  65. con(v, u);
  66. }
  67. }
  68. int temp = r[0];
  69. cout << temp;
  70. while (r[temp] != (n + 1))
  71. {
  72. cout << " " << r[temp];
  73. temp = r[temp];
  74. }
  75. cout << endl;
  76. }
  77. }
  78. return 0;
  79. }
  80. /**********************************************************************
  81. Problem: 1982
  82. User: leo6033
  83. Language: C++
  84. Result: AC
  85. Time:984 ms
  86. Memory:4368 kb
  87. **********************************************************************/

这题还能用链表来写,可以自己思考思考


CSUOJ 1982 小M的移动硬盘的更多相关文章

  1. csu 1982:小M的移动硬盘(双向链表)

    Description 最近小M买了一个移动硬盘来储存自己电脑里不常用的文件.但是他把这些文件一股脑丢进移动硬盘后,觉得这些文件似乎没有被很好地归类,这样以后找起来岂不是会非常麻烦? 小M最终决定要把 ...

  2. CSU-1982 小M的移动硬盘

    CSU-1982 小M的移动硬盘 Description 最近小M买了一个移动硬盘来储存自己电脑里不常用的文件.但是他把这些文件一股脑丢进移动硬盘后,觉得这些文件似乎没有被很好地归类,这样以后找起来岂 ...

  3. 中南大学2019年ACM寒假集训前期训练题集(基础题)

    先写一部分,持续到更新完. A: 寒衣调 Description 男从戎,女守家.一夜,狼烟四起,男战死沙场.从此一道黄泉,两地离别.最后,女终于在等待中老去逝去.逝去的最后是换尽一生等到的相逢和团圆 ...

  4. KVM客户机使用主机USB设备

    有些时候KVM客户机还是要使用USB设备,比如USB密钥等 KVM命令行参数 -usb 打开usb驱动程序,启动客户机usb支持 -usbdevice devname 为客户机增加usb设备,devn ...

  5. kvm云主机使用宿主机usb设备

    有些时候KVM客户机还是要使用USB设备,比如USB密钥等 KVM命令行参数 -usb 打开usb驱动程序,启动客户机usb支持-usbdevice devname 为客户机增加usb设备,devna ...

  6. CSUOJ 1973 给自己出题的小X DFS

    Description 小X学习了dfs,为了练习搜索,开始给自己出题玩. 玩着玩着,一会把自己难住了,一会又被自己难倒了,真是有趣诶! 小X出的题: 现在有N个不同的正整数,求它们可以组成多少个这样 ...

  7. mount 移动硬盘出现的各种小问题

    1.fdisk -l 查看硬盘是否存在 2.新建要挂载硬盘的文件夹 mkdir  /disk   (如果想要挂载到已存在的目录就不要新建了) 3.挂载硬盘:mount /dev/sdc /disk 4 ...

  8. Mac无法写入移动硬盘

    1.使用mac 磁盘工具,格式化移动硬盘 频繁穿插于mac于pc之间者,大批量拷贝大型文件者,请用exfat 首先,排除Fat32,虽然这是兼容性最好的文件格式,但一个不支持4g以上文件的格式(现在随 ...

  9. windows读取mac格式移动硬盘的方法

    本文记录了一些window与mac数据在移动设备上互相拷贝的经验. 一.准备 家里有一台mac电脑,限于硬盘空间比较小,需要定期备份一些数据. 由于备份数据大小在20G左右,并且并没有压缩为一个压缩文 ...

随机推荐

  1. [转载]解决flash与js交互、flash跨域交互、flash跨域提交

    http://blog.csdn.net/andyxm/article/details/5219919 我们引用本地flash,实现flash与js双向交互. function thisMovie(m ...

  2. golang sql.DB

    数据库 sql.DB连接池需知: sql.DB内置连接池,连接不足时会自动创建新连接,新创建的连接使用sql.Open()时传入的dsn来构造. sql.DBClose时只会关闭连接池中的连接,未归还 ...

  3. 微信小程序开发教程(七)逻辑层——.js详解

    逻辑层,是事务逻辑处理的地方.对于小程序而言,逻辑层就是.js脚本文件的集合.逻辑层将数据进行处理后发送给视图层,同时接收视图层的事件反馈. 微信小程序开发框架的逻辑层是由JavaScript编写.在 ...

  4. UNIX环境高级编程 第13章 守护进程

    守护进程daemon是一种生存周期很长的进程.它们通常在系统引导时启动,在系统关闭时终止.守护进程是没有终端的,它们一直在后台运行. 守护进程的特征 在Linux系统中,可以通过命令 ps -efj ...

  5. 2016.6.20——Plus One

    Plus One 本题收获 1.vector<int> 和vector<char>的区别,及与int转换 从vector<int> nums 转换为int res型 ...

  6. JDK1.8源码ArrayList

    线程不安全的,如果要想线程安全必须在创建的时候就采用线程安全的方式创建: List list = Collections.synchronizedList(new ArrayList(...)); 引 ...

  7. nginx 的多域名多https转发设置方法【转】

    version: 1.1(fixed) 修正一些错误基本环境:/etc/nginx/nginx.conf #保持/etc/nginx/ssl/    #ssl认证文件/etc/nginx/site-a ...

  8. BZOJ4840 NEERC2016 Binary Code

    Problem BZOJ Solution 可能是因为快要省选了,所以最近更博的频率好像高了点_(:зゝ∠)_ 每个字符串最多有两个状态,然后要满足一些依赖关系,考虑2sat.可以先把字符串的结束节点 ...

  9. idea中使用tomcat 方式启动spring boot项目

    Spring boot 的main 入口启动方式相信都会用,直接运行main直接就启动了,但是往往这种方式并不是最佳的启动方式,比如运维的层面更希望调整tomcat的调优参数,而只使用嵌入启动方式很难 ...

  10. Jenkins忘记用户名密码

    一.进入C盘.jenkins配置文件中找到config.xml 需要删除一下内容: <useSecurity>true</useSecurity> <authorizat ...