csu 1982: 小M的移动硬盘

1982: 小M的移动硬盘

Submit Page   Summary   Time Limit: 1 Sec     Memory Limit: 128 Mb     Submitted: 48     Solved: 10


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
10 5
1 5
2 3
2 6
3 4 8
3 1 3

Sample Output

5 2 7 8 4 9 10 3 1 6

Hint

Source

2017年暑期集训校队选拔

Author

卢铭威

题解:

使用链表来模拟   看一下数据大小  还有时间的大小

可以知道只有使用链表  才可以过

但是链表的查找时间是O(n)

所以我们要多设置多个指针    a[i]->next   指向i所在的那个位置

这样查找的时间就成了O(n)

  1 #include <cstdio>
  2 #include <time.h>
  3 #include <stdlib.h>
  4 #include <cstring>
  5 using namespace std;
  6 struct doublenode
  7 {
  8     int data;
  9     struct doublenode *next ,*prior ;
 10 };                      //定义一个双向链表
 11 typedef struct doublenode dnode; //格式化定义
 12
 13 int main()
 14 {
 15     int t;
 16     scanf("%d",&t);
 17     while(t--)
 18     {
 19         int n,m;
 20         scanf("%d%d",&n,&m);
 21         dnode *pnew,*phead,*ptail,*pend,*pk_1,*pk,*pk1,*p1,*p2, *mp[300009];
 22         phead=(dnode *)malloc(sizeof(dnode));  //为链表设计一个头结点
 23         mp[0]=(dnode *)malloc(sizeof(dnode));
 24         phead->data=0;
 25         phead->next =NULL;
 26         phead->prior =NULL;
 27         ptail=phead;
 28         mp[0]->next=phead;
 29         mp[0]->prior=NULL;
 30         mp[0]->data=0;
 31         for(int i=1; i<=n; i++)
 32         {
 33             pnew=(dnode *)malloc(sizeof(dnode));  //生成头结点,尾插法
 34             pnew->data=i;
 35             ptail->next =pnew ;
 36             pnew->prior =ptail;
 37             ptail=pnew;
 38             ptail->next =NULL;
 39             mp[i]=(dnode *)malloc(sizeof(dnode));
 40             mp[i]->next=ptail;
 41             mp[i]->prior=NULL;
 42             mp[i]->data=i;
 43         }
 44         pend=(dnode *)malloc(sizeof(dnode));
 45
 46         pend->prior=ptail;
 47         ptail->next=pend;
 48         pend->next=NULL;
 49         int haha=0;
 50         while(m--)
 51         {
 52
 53             int c,k,d;
 54             scanf("%d",&c);
 55             if(c==1)
 56             {
 57                 scanf("%d",&k);
 58                 pk=mp[k]->next;
 59                 pk_1=pk->prior;
 60                 pk1=pk->next;
 61                 pk_1->next=pk_1->next->next;
 62                 pk1->prior=pk1->prior->prior;
 63                 p1=phead->next;
 64                 pk->next=p1;
 65                 pk->prior=phead;
 66                 phead->next=pk;
 67                 p1->prior=pk;
 68             }
 69             else if(c==2)
 70             {
 71                 scanf("%d",&k);
 72                 pk=mp[k]->next;
 73                 pk_1=pk->prior;
 74                 pk1=pk->next;
 75                 pk_1->next=pk_1->next->next;
 76                 pk1->prior=pk1->prior->prior;
 77
 78                 p1=pend->prior;
 79                 pk->next=pend;
 80                 pk->prior=p1;
 81                 p1->next=pk;
 82                 pend->prior=pk;
 83             }
 84             else
 85             {
 86                 scanf("%d%d",&k,&d);
 87
 88                 pk=mp[k]->next;
 89                 pk_1=pk->prior;
 90                 pk1=pk->next;
 91                 pk_1->next=pk_1->next->next;
 92                 pk1->prior=pk1->prior->prior;
 93
 94                 p1=mp[d]->next;
 95                 p2=p1->next;
 96                 pk->next=p2;
 97                 pk->prior=p1;
 98                 p1->next=pk;
 99                 p2->prior=pk;
100             }
101             //printf("第%d步已经完成\n",++haha);
102         }
103       //  printf("操作已完成\n");
104       //  scanf("%d",&m);
105         pnew=phead->next;
106         while(pnew->next)
107         {
108             printf("%d ",pnew->data);
109             pnew=pnew->next;
110         }
111         printf("\n");
112     }
113     return 0;
114 }
时间: 2024-10-24 21:16:38

csu 1982: 小M的移动硬盘的相关文章

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

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

CSU 1802 小X的战斗力【拓扑dp】

题目链接 题意:n个人,每个人有一个能力值.给出m组关系A, B, 表示A的能力值大于B的能力值. 问:m组关系中是否有自相矛盾的?若不矛盾,问:第1个人在所有人的能力值中排名第几?有多少人的能力值的排名可以确定? 题解:拓扑排序.存两个图,原图与反图. 若原图可达该点数+反图可达该点数-1 = n,则排名确定. bitset一下. 1 #include <bits/stdc++.h> 2 using namespace std; 3 #define X first 4 #define Y s

移动硬盘分区小妙招

在此感谢csdn在14年底的时候推出博客之星的评选,然后小编就厚着脸皮参加了,感谢各位小伙伴辛苦的投票,你们的支持是对小编最大的鼓励,小编会再接再励,继续好好写博客,用文字记录这个美丽的过程,用文字整理生命,博客之星的评选活动持续了将近一个月的时间,然后经过网友投票,专家评审,经过层层筛选,结果出来的,小编名列第十一,革命尚未成功,小编来年再战,名列十一,csdn为了鼓励小编,给小编寄了一个2T的硬盘,这下子可把小编高兴坏了`(*∩_∩*)′,那叫一个激动啊! 2T的硬盘啊,如果不分区,是多么危

AirDisk存宝Q2 网盘转接器 移动硬盘伴侣NAS私有云

首先我是通过朋友介绍然后到官网 www.airdisk.cc 查了了一下,才决定入手这个Q2,一次性买了两,上面东西还挺多. 包装彩盒包装有的简单欠档次,不过不影响使用. 配件:主机.电源适配器(5V-2A).网线(6类的).数据线.说明书. 小巧玲珑,轻便 接口: 一个microUSB接口,供电使用,官方标配5V-2A电源适配器. 一个网口,具有10/100/1000Mbps自适应网口. 一个USB3.0接口:可外接U盘.读卡器.移动硬盘.硬盘柜还有UHB分线器扩大存储容量,支持主流文件系统,

csu 1976: 搬运工小明

1976: 搬运工小明 Submit Page   Summary   Time Limit: 2 Sec     Memory Limit: 128 Mb     Submitted: 94     Solved: 27 Description 作为老人的小明非常忧伤,因为他马上要被流放到本部去了,住进全左家垅最有历史感的11舍真是一件非常荣幸的事情.搬行李是个体力活,小明发现自己的行李太多啦,所以他决定去买很多个袋子来装走.到了超市的小明发现,不同大小的袋子居然价格一样???虽然买最大的自然

CSU 1547 Rectangle(dp、01背包)

题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1547 Description Now ,there are some rectangles. The area of these rectangles is 1* x or 2 * x ,and now you need find a big enough rectangle( 2 * m) so that you can put all rectangles into it(th

轮播特效小项目总结

首先谈谈关于还原设计稿学到的一些东西,比如说网页设计稿和交互效果做好了,拿给我们在网页上实现,那如何实现呢,我就说说自己的鄙见吧. 第一,思考整个设计图的层次,比如说分别由哪些部分构成,针对这些"块",怎么设计div的结构,怎么把静态页面有条理的编写出来. 第二,思考如何实现设计图的交互效果,在逻辑上分析,比如用JS绑定哪些事件,采用什么样的函数实现怎么样的效果等等. 第三,代码的优化性考虑,怎么让代码简洁明了,方便维护. 以上就是我现在阶段对页面还原的一些看法,也许比较浅显,我也希望

一块移动硬盘怎样兼容Mac和Windows系统,并且可以在time machine上使用

Mac的内存通常不是很大,加上使用Mac的time machine备份的话,是需要外置U盘或硬盘的.U盘存储空间较小,大家也不会去分区,直接拿来用在Mac上或者Windows上就可以了.所以这里只说硬盘.现在的USB接口的移动硬盘白菜价,四五百块钱1T的硬盘是现在最常用的,也是我买的类型.我希望这块硬盘可以用在time machine备份上,也可以在Mac和Windows上读写文件. 上网查了很多,也试了几个方法,网上关于Mac和Windows可共同读写硬盘的讨论很多,大致方法有两种: 1.移动

oracle的环境配置-oracle的小版本升级

oracle的小版本升级:从10.2.0.1升级到10.2.0.4 需要准备的升级包:p6810189_10204_Linux-x86 1.当前版本 SQL> conn /as sysdbaConnected.SQL> select * from v$version; BANNER----------------------------------------------------------------Oracle Database 10g Enterprise Edition Relea