Luogu 1160 队列安排
链表H2O H2O H2O模板。
太久不写链表,忘干净了,竟调了半个晚上。
保留备用。
#include <cstdio>
#include <cstring>
const int MAXN=100010;
int n,m;
class LinkedList
{
public:
LinkedList(void)
{
memset(a,0,sizeof a);
memset(s,0,sizeof s);
a[1]=1,s[0].c[1]=cnt=1,s[cnt].v=1;
}
void Insert(int n,int x,bool flag)
{
int i=a[n],j=s[i].c[flag],p=a[x]=++cnt;
s[p].v=x,s[i].c[flag]=p,s[p].c[!flag]=i,s[p].c[flag]=j,s[j].c[!flag]=p;
}
void Delete(int x)
{
if(a[x])
{
int i=a[x],p=s[i].c[0],q=s[i].c[1];
a[x]=0,s[p].c[1]=q,s[q].c[0]=p;
}
}
void Print(void)
{
for(int i=s[0].c[1];i;i=s[i].c[1])
printf("%d ",s[i].v);
putchar(‘\n‘);
}
private:
int cnt,a[MAXN];
struct node
{
int v,c[2];
}s[MAXN];
}T;
int main(int argc,char *argv[])
{
scanf("%d",&n);
for(int i=2,k,p;i<=n;++i)
{
scanf("%d %d",&k,&p);
T.Insert(k,i,p);
}
scanf("%d",&m);
for(int i=1,x;i<=m;++i)
{
scanf("%d",&x);
T.Delete(x);
}
T.Print();
return 0;
}
谢谢阅读。