正题
评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P1160
题目大意
有nn个人,编号是,然后开始时插入第一个人,之后每次可以插入到一个人的左边或右边,然后去掉mm<script type="math/tex" id="MathJax-Element-55">m</script>个人,最后输出队列顺序。
解题思路
裸的链表题
插入操作:
if(c)
{node[node[x].next].prev=i;node[i].next=node[x].next;node[x].next=i;node[i].prev=x;
}
else
{node[node[x].prev].next=i;node[i].prev=node[x].prev;node[x].prev=i;node[i].next=x;
}
删除操作:
node[node[x].prev].next=node[x].next;
node[node[x].next].prev=node[x].prev;
code
#include<cstdio>
using namespace std;
struct Node{bool ok;int prev,next;
}node[100011];
int n,m,x,c,begin;
int main()
{scanf("%d",&n);node[0].next=1;node[0].prev=1;for(int i=2;i<=n;i++){scanf("%d%d",&x,&c);if(c){node[node[x].next].prev=i;node[i].next=node[x].next;node[x].next=i;node[i].prev=x;}//插入右边else{node[node[x].prev].next=i;node[i].prev=node[x].prev;node[x].prev=i;node[i].next=x; }//插入左边}scanf("%d",&m);for(int i=1;i<=m;i++){scanf("%d",&x);if(!node[x].ok){node[node[x].prev].next=node[x].next;node[node[x].next].prev=node[x].prev;node[x].ok=true;}//删除}x=0;while(node[x].next!=0){printf("%d ",node[x].next);x=node[x].next;}//输出
}