P1160 队列安排 洛谷

 https://www.luogu.org/problem/show?pid=1160

题目描述

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

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

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

3.从队列中去掉M(M<N)个同学,其他同学位置顺序不变。

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

输入输出格式

输入格式:

输入文件arrange.in的第1行为一个正整数N,表示了有N个同学。

第2~第N行,第i行包含两个整数k,p,其中k为小于i的正整数,p为0或者1。若p为0,则表示将i号同学插入到k号同学的左边,p为1则表示插入到右边。

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

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

输出格式:

输入文件arrange.out仅包括1行,包含最多N个空格隔开的正整数,表示了队列从左到右所有同学的编号,行末换行且无空格。

输入输出样例

输入样例#1:
4
1 0
2 1
1 0
2
3
3
输出样例#1:
2 4 1

将同学2插入至同学1左边,此时队列为:
2 1
将同学3插入至同学2右边,此时队列为:
2 3 1
将同学4插入至同学1左边,此时队列为:
2 3 4 1
将同学3从队列中移出,此时队列为:
2 4 1
同学3已经不在队列中,忽略最后一条指令
最终队列:
2 4 1

说明

对于20%的数据,有N≤10;

对于40%的数据,有N≤1000;

对于100%的数据,有N, M≤100000。

 1 #include <algorithm>
 2 #include <iostream>
 3 #define N 1000015
 4 
 5 using namespace std;
 6 
 7 int n,x,y,m;
 8 struct node
 9 {
10     int pre,next;
11 }que[N];
12 
13 int main()
14 {
15     cin>>n;
16     que[0].next=1;
17     que[1].pre=0,que[1].next=-1;
18     for(int i=2;i<=n;i++)
19     {
20         cin>>x>>y;
21         if(y)
22         {
23             que[que[x].next].pre=i;
24             que[i].next=que[x].next;
25             que[x].next=i;
26             que[i].pre=x;
27         }
28         else
29         {
30             que[i].pre=que[x].pre;
31             que[que[x].pre].next=i;
32             que[x].pre=i;
33             que[i].next=x;
34         }
35     }
36     
37     cin>>m;
38     for(int i=1;i<=m;i++)
39     {
40         cin>>x;
41         if(que[x].next==-1&&que[x].pre==-1)    continue;
42         que[que[x].pre].next=que[x].next;
43         que[que[x].next].pre=que[x].pre;
44         que[x].next=que[x].pre=-1;
45     }
46     int k=que[0].next;
47     while(k!=-1)
48     {
49         cout<<k<<" ";
50         k=que[k].next;
51     }
52     return 0;
53 }
队列,链表
 1 #include <algorithm>
 2 #include <iostream>
 3 #define N 100005
 4 
 5 using namespace std;
 6 
 7 int n,m,x,y,z,top;
 8 int que[N];
 9 int vis[N];
10 
11 int main()
12 {
13     cin>>n;
14     que[++top]=1;
15     for(int i=2;i<=n;i++)
16     {
17         cin>>x>>y;
18         if(y==0)
19         {
20             for(int j=1;j<=top;j++)
21             {
22                 if(que[j]==x)
23                 {
24                     top++;
25                     for(int k=top;k>j;k--)
26                         que[k]=que[k-1];
27                     que[j]=i;
28                     break;
29                 }
30             }
31         }
32         else
33         {
34             for(int j=1;j<=top;j++)
35             {
36                 if(que[j]==x)
37                 {
38                     top++;
39                     for(int k=top;k>=j;k--)
40                         que[k+1]=que[k];
41                     que[j+1]=i;
42                     break;
43                 }
44             }
45         }
46     }
47     cin>>m;
48     for(int i=1;i<=m;i++)
49     {
50         cin>>x;
51         vis[x]=1;
52         if(vis[x])
53         for(int j=1;j<=top;j++)
54         {
55             if(que[j]==x)
56             {
57                 for(int k=j;k<top;k++)
58                     que[k]=que[k+1];
59                 top--;
60                 break;
61             }
62         }
63     }
64     for(int i=1;i<=top;i++)
65         cout<<que[i]<<" ";
66     return 0;
67 }
纯模拟 T一大半
——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
原文地址:https://www.cnblogs.com/Shy-key/p/6582432.html