P1160 CE求助!
  • 板块题目总版
  • 楼主wdm123
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/22 17:39
  • 上次更新2024/10/22 19:57:14
查看原帖
P1160 CE求助!
1431568
wdm123楼主2024/10/22 17:39

P1160 队列安排

题目描述

一个学校里老师要将班上 NN 个同学排成一列,同学被编号为 1N1\sim N,他采取如下的方法:

  1. 先将 11 号同学安排进队列,这时队列中只有他一个人;

  2. 2N2\sim N 号同学依次入列,编号为 ii 的同学入列方式为:老师指定编号为 ii 的同学站在编号为 1(i1)1\sim(i-1) 中某位同学(即之前已经入列的同学)的左边或右边;

  3. 从队列中去掉 MM 个同学,其他同学位置顺序不变。

在所有同学按照上述方法队列排列完毕后,老师想知道从左到右所有同学的编号。

输入格式

第一行一个整数 NN,表示了有 NN 个同学。

2N2\sim N 行,第 ii 行包含两个整数 k,pk,p,其中 kk 为小于 ii 的正整数,pp00 或者 11。若 pp00,则表示将 ii 号同学插入到 kk 号同学的左边,pp11 则表示插入到右边。

N+1N+1 行为一个整数 MM,表示去掉的同学数目。

接下来 MM 行,每行一个正整数 xx,表示将 xx 号同学从队列中移去,如果 xx 号同学已经不在队列中则忽略这一条指令。

输出格式

一行,包含最多 NN 个空格隔开的整数,表示了队列从左到右所有同学的编号。

#include<bits/stdc++.h>
using namespace std;
struct node{
	int pre,nxt,key;
	node(int _key=0,int _pre=0,int _nxt=0)
	{pre=_pre;nxt=_nxt;key=_key;}
};
node s[100005];
int n,m,tot=0,index[100005]={0};
void ins_back(int x,int y)
{
	int now=index[x];
	s[++tot]=node(y,now,s[now].nxt);
	s[s[now].nxt].pre=tot;
	index[y]=tot;
}
void ins_front(int x,int y)
{
	int now=index[x];
	s[++tot]=node(y,s[now].pre,now);
	s[s[now].pre].nxt=tot;
	s[now].pre=tot;
	index[y]=tot;
}
void del(int x)
{
	int now=index[x];
	int le=s[now].pre,rt=s[now].nxt;
	s[le].nxt=rt;
	s[rt].pre=le;
	index[x]=0;
}
int main()
{
	int x,k,p,now;
	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(index[x])del(x);
	}
	now=s[0].nxt;
	while(now)
	{
		cout<<s[now].key<<" ";
		now=s[now].nxt;
	}
	return 0;
}

我哪错了?(编译)

2024/10/22 17:39
加载中...