1. 程式人生 > >【資料結構】【連結串列】HDU6375 度度熊學佇列

【資料結構】【連結串列】HDU6375 度度熊學佇列

分析:

連結串列真好。。。。 不用管中間到底誰前誰後。只需要保證兩端是合法的。 這樣反正你都得從兩端縮到中間去,縮的時候判斷一下,如果是刪去右端點,那麼判斷右端點的左端點的右指標:是否為當前刪去的點,不是則交換其指標。

這樣就能保證端點的指標一定合法。而中間的只需要縮排去的時候更新一下即可。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define SF scanf
#define PF printf
#define MAXN 400010
using namespace
std; int n; void read(int &x){ char ch = getchar();x = 0; for (; ch < '0' || ch > '9'; ch = getchar()); for (; ch >='0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0'; } struct node * NIL; struct node{ int val; node * nxt,*las; void pushdown(){ if
(las!=NIL){ if(las->nxt!=this) swap(las->nxt,las->las); } if(nxt!=NIL){ if(nxt->las!=this) swap(nxt->nxt,nxt->las); } } }p[MAXN],*ncnt; node *head[MAXN],*tail[MAXN]; node * Newnode(int val){ node *
x=++ncnt; x->val=val; x->nxt=x->las=NIL; return x; } int main(){ NIL=&p[0]; NIL->val=-1; NIL->nxt=NIL->las=NIL; int q; while(SF("%d%d",&n,&q)!=EOF){ ncnt=&p[0]; int tag,u,v,w,val; for(int i=1;i<=n;i++) head[i]=tail[i]=NIL; for(int i=1;i<=q;i++){ //SF("%d",&tag); read(tag); if(tag==1){ read(u); read(w); read(val); //SF("%d%d%d",&u,&w,&val); if(w==0){ node *x=Newnode(val); x->las=head[u]; if(head[u]!=NIL) head[u]->nxt=x; else tail[u]=x; head[u]=x; } else{ node *x=Newnode(val); x->nxt=tail[u]; if(tail[u]!=NIL) tail[u]->las=x; else head[u]=x; tail[u]=x; } } else if(tag==2){ read(u); read(w); //SF("%d%d",&u,&w); if(w==0){ head[u]->pushdown(); PF("%d\n",head[u]->val); node *x=head[u]->las; x->nxt=NIL; head[u]=x; if(x==NIL) tail[u]=NIL; } else{ tail[u]->pushdown(); PF("%d\n",tail[u]->val); node *x=tail[u]->nxt; x->las=NIL; tail[u]=x; if(x==NIL) head[u]=NIL; } } else{ read(u); read(v); read(w); //SF("%d%d%d",&u,&v,&w); if(w==0){ if(head[v]!=NIL) head[v]->nxt=tail[u]; if(tail[u]!=NIL) tail[u]->las=head[v]; if(tail[v]!=NIL) tail[u]=tail[v]; if(head[u]==NIL) head[u]=head[v]; head[v]=NIL; tail[v]=NIL; } else{ swap(tail[v]->nxt,tail[v]->las); swap(head[v]->nxt,head[v]->las); if(tail[v]!=NIL) tail[v]->nxt=tail[u]; if(tail[u]!=NIL) tail[u]->las=tail[v]; if(head[v]!=NIL) tail[u]=head[v]; if(head[u]==NIL) head[u]=tail[v]; head[v]=NIL; tail[v]=NIL; } } } } }