2528: 【普及/提高-】【P1160】队列安排
内存限制:256 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:19
解决:3
题目描述
一个学校里老师要将班上 个同学排成一列,同学被编号为 ,他采取如下的方法:
-
先将 号同学安排进队列,这时队列中只有他一个人;
-
号同学依次入列,编号为 的同学入列方式为:老师指定编号为 的同学站在编号为 中某位同学(即之前已经入列的同学)的左边或右边;
-
从队列中去掉 个同学,其他同学位置顺序不变。
在所有同学按照上述方法队列排列完毕后,老师想知道从左到右所有同学的编号。
输入
第一行一个整数 ,表示了有 个同学。
第 行,第 行包含两个整数 ,其中 为小于 的正整数, 为 或者 。若 为 ,则表示将 号同学插入到 号同学的左边, 为 则表示插入到右边。
第 行为一个整数 ,表示去掉的同学数目。
接下来 行,每行一个正整数 ,表示将 号同学从队列中移去,如果 号同学已经不在队列中则忽略这一条指令。
输出
一行,包含最多 个空格隔开的整数,表示了队列从左到右所有同学的编号。
样例输入 复制
4
1 0
2 1
1 0
2
3
3
样例输出 复制
2 4 1
提示
【样例解释】
将同学 插入至同学 左边,此时队列为:
2 1
将同学 插入至同学 右边,此时队列为:
2 3 1
将同学 插入至同学 左边,此时队列为:
2 3 4 1
将同学 从队列中移出,此时队列为:
2 4 1
同学 已经不在队列中,忽略最后一条指令
最终队列:
2 4 1
【数据范围】
对于 的数据,。
对于 的数据,。
对于 的数据,。
#include<bits/stdc++.h>
using namespace std;
int n,i,k,p,m,x;
list <int> a;
int main(){
scanf("%d",&n);
a.push_front(1);
list<int>::iterator it;
for(i = 2;i <= n;i++) {
scanf("%d%d",&k,&p);
it=find(a.begin(),a.end(),k);
if (p==0) {
a.insert(it,i);
}else {
a.insert(++it,i);
}
}
scanf("%d",&m);
while(m--) {
scanf("%d",&x);
it=find(a.begin(),a.end(),x);
if(it!=a.end()) {
a.erase(it);
}
}
for(it = a.begin();it != a.end();it++) {
printf("%d ",(*it));
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int n,k,p,x,m,mark[100005]={0};
list<int> l;
list<int>::iterator it[100005],tmpit;
int main(){
cin>>n;
l.push_front(1);
it[1]=l.begin();
for(int i=2;i<=n;i++) {
cin>>k>>p;
if(p==0) {
it[i]=l.insert(it[k],i);
}else{
if(it[k]==l.end()) {
l.push_back(i);
it[i]=l.end();
}else{
tmpit=it[k];
tmpit++;
it[i]=l.insert(tmpit,i);
}
}
}
cin>>m;
for(int i=1;i<=m;i++) {
cin>>x;
if(mark[x]==1) continue;
mark[x]=1;
l.erase(it[x]);
}
for(tmpit=l.begin();tmpit!=l.end();tmpit++) {
cout<<*tmpit<<" ";
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
struct node {
int key,pre,nxt;
node(int _key=0,int _pre=0,int _nxt=0) {
key=_key;pre=_pre;nxt=_nxt;
}
};
node s[100005];
int n,m,k,p,x,idx[100005]={0},tot=0,now;
void ins_back(int x,int y) {
int now=idx[x];
s[++tot]=node(y,now,s[now].nxt);
s[s[now].nxt].pre=tot;
s[now].nxt=tot;
idx[tot]=tot;
}
void ins_front(int x,int y) {
int now=idx[x];
s[++tot]=node(y,s[now].pre,now);
s[s[now].pre].nxt=tot;
s[now].pre=tot;
idx[tot]=tot;
}
void del(int x) {
int now=idx[x];
int le=s[now].pre,rt=s[now].nxt;
s[le].nxt=rt;
s[rt].pre=le;
idx[x]=0;
}
int main(){
cin>>n;
s[0]=node();
ins_back(0,1);
for (int i=2;i<=n;i++) {
cin>>k>>p;
p?ins_back(k,i):ins_front(k,i);
}
cin>>m;
for (int i=1;i<=m;i++) {
cin>>x;
if (idx[x]) del(x);
}
now=s[0].nxt;
while (now) {
cout<<s[now].key<<" ";
now=s[now].nxt;
}
return 0;
}