• csu 1982: 小M的移动硬盘


    1982: 小M的移动硬盘

            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步已经完成
    ",++haha);
    102         }
    103       //  printf("操作已完成
    ");
    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("
    ");
    112     }
    113     return 0;
    114 }
  • 相关阅读:
    移动端UI
    jQuery 下拉框三级联动
    jQuery基础与学习资源
    jQuery
    TCP、UDP、HTTP、SOCKET之间的区别
    Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)
    android 中 任务、进程和线程的区别
    android中不同手机分辨率适配问题
    经验分享:CSS浮动(float,clear)通俗讲解(真的很通俗)
    关于各种排列组合java算法
  • 原文地址:https://www.cnblogs.com/52why/p/7460174.html
Copyright © 2020-2023  润新知