csu 1982:小M的移動硬碟(雙向鏈表)

來源:互聯網
上載者:User

標籤:names   clu   code   scan   log   pac   開始   問題   std   

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
110 51 52 32 63 4 83 1 3
Sample Output
5 2 7 8 4 9 10 3 1 6

第一次用鏈表做題,用一個數組儲存每個數字所在的地址就可以實現O(1)尋找了,坑了我很久,我開始建了一個迴圈雙鏈表,結果死活WA(好像問題是出在第二步移動操作了),然後我將尾指標棄之不用,每次都是插在尾指標前面,然後就AC了.

#include<iostream>#include<cstdio>#include<algorithm>#include <string.h>#include <math.h>using namespace std;const int N =300005;typedef long long LL;typedef struct LNode{     int data;     struct LNode *next,*pre;}*LinkList,LNode;LinkList id[N];LinkList L,tail;void create(int n,LinkList &L,LinkList &tail){    LinkList p,r;    r = new LNode;    tail = new LNode;    L->next = L->pre = L;    L = r;    int i= 1;    while(i<=n){        p = new LNode;        p->data = i;        id[i] = p;        i++;        r->next = p;        p->pre = r;        r = p;    }    r->next = tail;    tail->pre = r;}void HeadInsert(LinkList &L,LinkList &p){    p->next = L->next;    L->next = p;    p->pre = L;    p->next->pre = p;}void TailInsert(LinkList &tail,LinkList &p){    tail->pre->next = p;    p->pre = tail->pre;    p->next = tail;    tail->pre = p;}void InsertUV(LinkList &p,LinkList &q){    q->next->pre = p;    p->pre = q;    p->next = q->next;    q->next = p;}void Travel(LinkList L){    LNode *p = L->next;    while(p!=tail){        printf("%d ",p->data);        p = p->next;    }}int main(){    int tcase;    scanf("%d",&tcase);    int n,m;    while(tcase--)    {        L = new LNode;        scanf("%d %d",&n,&m);        create(n,L,tail);        int op,u,v;        while(m--){            scanf("%d",&op);            if(op==1){                scanf("%d",&u);                LinkList p = id[u];                if(L->next ==p) continue;                p->pre->next = p->next;                p->next->pre = p->pre;                HeadInsert(L,p);            }            if(op==2){                scanf("%d",&u);                LinkList p = id[u];                if(p==tail) continue;                p->pre->next = p->next;                p->next->pre = p->pre;                TailInsert(tail,p);                //Travel(L);            }            if(op==3){                scanf("%d %d",&u,&v);                LinkList p = id[u],q = id[v];                if(p==q) continue;                p->pre->next = p->next;                p->next->pre = p->pre;                InsertUV(p,q);            }        }        Travel(L);        LinkList p=L,q;        while(p!=tail){            q = p;            p=p->next;            delete q;        }        delete tail;        printf("\n");    }    return 0;}

 

csu 1982:小M的移動硬碟(雙向鏈表)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.