注意!!
链表的头跟尾的删除与添加要特判
链表为空要特判
pool的pt位置与后面要对应
#include<cstdio> using namespace std; int readint(){ int ans=0,f=1; char c=getchar(); while(!(c>='0'&&c<='9')){ if(c=='-') f=-1; c=getchar(); } while(c>='0'&&c<='9'){ ans=ans*10+c-'0'; c=getchar(); } return f*ans; } const int maxn=23009; struct node{ int w; node*nt,*rd; node():w(0),nt(NULL),rd(NULL){} node(int W):w(W),nt(NULL),rd(NULL){} }x[maxn],*head,*tail,*pt=x; int n,m,k,num; int W; void add(){ pt->w=W; pt->nt=pt->rd=NULL; if(head==NULL) tail=head=pt; else{ tail->nt=pt; tail=pt; } pt++; } void init(){ head=tail=NULL; } int main(){ init(); n=readint();m=readint();k=readint();num=readint(); for(int i=0;i<n;i++){ W=readint(); add(); } node*t=head,*pre=head; for(int i=0;i<n;i++){ W=readint(); if(W!=-1) x[i].rd=x+W; } for(int i=0;i<m;i++){ W=readint(); for(t=head,pre=head;;W--,pre=t,t=t->nt){ if(!W){ if(t==head) head=head->nt; else pre->nt=t->nt; for(int i=0;i<n;i++) if(x[i].rd==t) x[i].rd=NULL; break; } } } for(int i=0;i<k;i++){ W=readint(); int pos=readint(),tar=readint(); pt++; pt->w=W; if(pos==0){ pt->nt=head; head=pt; if(tar==-1) pt->rd=NULL; else for(node*tmp=head;;tar--,tmp=tmp->nt){ if(!tar){ pt->rd=tmp; break; } } }else for(t=head,pre=head;;pos--,pre=t,t=t->nt){ if(!pos){ pre->nt=pt; pt->nt=t; if(tar==-1) pt->rd=NULL; else for(node*tmp=head;;tar--,tmp=tmp->nt){ if(!tar){ pt->rd=tmp; break; } } break; } } } node*T=head; for(;;num--,T=T->nt){ if(!num) break; } for(t=T;t!=NULL;t=t->nt){ printf("%d",t->w); printf(t->nt==NULL?" -1\n":" "); } for(t=T;t!=NULL;t=t->rd){ printf("%d",t->w); printf(t->rd==NULL?" -1\n":" "); } if(T==NULL) printf("-1\n-1\n"); return 0; }