队列插入删除操作数组模拟
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 100000 + 10;
int l[maxn];
int r[maxn];
///l[i]表示i的前驱,r[i]表示i的后继。
int head = 0;
void solve()
{
int n;
scanf("%d",&n);
for(int i=2;i<=n;i++)
{
int k,p;
scanf("%d%d",&k,&p);
if(p)///将i号同学往K点的右边插入
{
if(!r[k])//如果是尾结点
{
r[k] = i;
l[i] = k;
}else
{
r[i] = r[k];
l[i] = k;
l[r[k]] = i;
r[k] = i;
}
}else ///将i号同学往K点的左边插入
{
if(!l[k])
{
l[k] = i;
r[i] = k;
head = i;
}else
{
l[i] = l[k];
r[i] = k;
r[l[k]] = i;
l[k] = i;
}
}
}
int m;
scanf("%d",&m);
while(m--)
{
int k;
scanf("%d",&k);将k号同学删除队列
if(!l[k]&&!r[k]) continue;
if(k==head) head = r[head];
r[l[k]] = r[k];///删除
l[r[k]] = l[k];
l[k] = 0;
r[k] = 0;
}
for(int p = head;p;p = r[p])
{
printf("%d ",p);///输出当前队列中的人
}
}
int main()
{
solve();
return 0;
}
数组模拟队列
最新推荐文章于 2024-04-25 11:09:52 发布