队列安排

题目描述

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

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

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

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

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

输入输出格式

输入格式

第111行为一个正整数NNN,表示了有NNN个同学。

第2−N2-N2−N行,第iii行包含两个整数k,pk,pk,p,其中kkk为小于iii的正整数,ppp为000或者111。若ppp为000,则表示将iii号同学插入到kkk号同学的左边,ppp为111则表示插入到右边。

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

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

输出格式

第111行,包含最多NNN个空格隔开的正整数,表示了队列从左到右所有同学的编号,行末换行且无空格。

输入输出样例

输入样例

4
1 0
2 1
1 0
2
3
3

输出样例 #1

2 4 1

说明

样例解释:

将同学222插入至同学111左边,此时队列为:

212 121

将同学333插入至同学222右边,此时队列为:

2312 3 1231

将同学444插入至同学111左边,此时队列为:

23412 3 4 12341

将同学333从队列中移出,此时队列为:

2412 4 1241

同学333已经不在队列中,忽略最后一条指令

最终队列:

2412 4 1241

数据范围

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

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

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

开始用的单向列表,发现双向也可以。但这都会超时。
复杂度可能为O(n*n),找到数据n,操作可以忽略,共n次。
时间浪费在了查找上面。
那我们开个数组,把每个编号同学对号入座,保存他的左右编号。
需要的时候,直接把他拉过来即可。
附上tle代码

#include<iostream>
#include<cstdio>
#include<malloc.h>
using namespace std;
struct node {int key;struct node* next;
};
int read()
{int flag=1,ans=0;char am=getchar();while((am>'9'||am<'0')&&am!='-') am=getchar();if(am=='-') flag=-1,am=getchar();while(am>='0'&&am<='9') ans=ans*10+am-'0',am=getchar();return ans*flag;
}
void add(int i,int p1,int k,node *head) {//       0 左, 1右node *am=head;node *tep=head->next;while(tep) {if(tep->key==p1) {node *p=(node*)malloc(sizeof(struct node));p->key=i;if(k==0) {p->next=tep;am->next=p;} else {p->next=tep->next;tep->next=p;}return;}am=tep;tep=tep->next;}
}
void del(int p1,node *head)
{node *tep=head->next;node *am=head;while(tep){if(tep->key==p1){am->next=tep->next;return;}am=tep;tep=tep->next;}}
node* build() {node *head=(node*)malloc(sizeof(struct node));head->key=-1;node *tep=(node*)malloc(sizeof(struct node));head->next=tep;tep->key=1;tep->next=NULL;return head;
}
void print(node *head) {node *te=head->next;while(te) {printf("%d ",te->key);te=te->next;}
}
int main(void) {int n,p,k;node *head=build();n=read();for(int i=2; i<=n; i++) {p=read();k=read();add(i,p,k,head);}int m;m=read();for(int i=1;i<=m;i++){int num;num=read();del(num,head);}print(head);}

pe[0]相当于头结点,不然你去哪里找第一人。
第一次用数组模拟链表,感觉有点新鲜呀。

#include<iostream>
#include<cstdio>
#include<malloc.h>
using namespace std;
struct node {int key;int next,pre;
};
node pe[100003];
int read()
{int flag=1,ans=0;char am=getchar();while((am>'9'||am<'0')&&am!='-') am=getchar();if(am=='-') flag=-1,am=getchar();while(am>='0'&&am<='9') ans=ans*10+am-'0',am=getchar();return ans*flag;
}
void add(int i,int p1,int k) {//k 0 左,1 右pe[i].key=i;if(k==0){pe[i].next=pe[p1].key;pe[i].pre=pe[p1].pre;pe[pe[p1].pre].next=pe[i].key;pe[p1].pre=pe[i].key;}else{pe[i].next=pe[p1].next;pe[i].pre=pe[p1].key;pe[pe[p1].next].pre=pe[i].key;pe[p1].next=pe[i].key;}}
void del(int p1)
{if(pe[p1].key==-1) return;pe[pe[p1].pre].next=pe[p1].next;pe[pe[p1].next].pre=pe[p1].pre;pe[p1].key=-1;
}
node build() {pe[0].next=pe[1].key;pe[1].next=-1;pe[1].pre=0;pe[0].pre=-1;pe[1].key=1;
}
void print() {int tep=pe[0].next;while(1){if(pe[tep].key){if(pe[tep].key!=-1)//说明此人被踢出了{printf("%d ",tep);}}else break;tep=pe[tep].next;}
}
int main(void) {int n,p,k;n=read();build();for(int i=2; i<=n; i++) {p=read();k=read();add(i,p,k);}int m;m=read();for(int i=1;i<=m;i++){int num;num=read();del(num);}print();
}

P1160 队列安排相关推荐

  1. 洛谷P1160 队列安排 链表

    洛谷P1160 队列安排   链表 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #i ...

  2. 洛谷-P1160 队列安排

    题目 Problem Description 一个学校里老师要将班上N个同学排成一列,同学被编号为1-N,他采取如下的方法: 1.先将1号同学安排进队列,这时队列中只有他一个人: 2.2-N号同学依次 ...

  3. P1160 队列安排 洛谷

    https://www.luogu.org/problem/show?pid=1160 题目描述 一个学校里老师要将班上N个同学排成一列,同学被编号为1-N,他采取如下的方法: 1.先将1号同学安排进 ...

  4. P1160 队列安排 链表

    题目链接 因为有很多删除与插入的操作,所以用链表是最好的方法.一道基础的链表题,用stl自带的链表解决,第一次使用,记录迭代器下标还是第一次见到-.- #pragma comment (linker, ...

  5. Luogu P1160 【队列安排】

    详细的链表讲解 很明显的一个链表裸题 和普通的链表有一个区别就是这个题 可以O(1)插入,O(1)查询 然后我们为了方便,采用双向链表,定义s.f作为指针数组 更详细的解释见代码 #include&l ...

  6. P2837 晚餐队列安排

    题目背景 Usaco Feb08 Bronze 题目描述 为了避免餐厅过分拥挤,FJ要求奶牛们分2批就餐.每天晚饭前,奶牛们都会在餐厅前排队入内,按FJ的设想,所有第2批就餐的奶牛排在队尾,队伍的前半 ...

  7. 晚餐队列安排‖(麻烦的聚餐)

    描述 为了避免餐厅过分拥挤,FJ要求奶牛们分 33 批就餐.每天晚饭前,奶牛们都会在餐厅前排队入内,按FJ的设想,所有第 33 批就餐的奶牛排在队尾,队伍的 前端由设定为第1批就餐的奶牛占据,中间的位 ...

  8. 【Luogu1160】队列安排(双向链表)

    problem n个人排队,先将1入队 依次指定编号2~n的站在前面某人的左边或右边 从队列中去掉m个人 solution codes #include<iostream> using n ...

  9. 洛谷【数据结构1-1】线性表

    P3156 [深基15.例1]询问学号 传送门 题目描述 有 n(n≤2×1^6) 名同学陆陆续续进入教室.我们知道每名同学的学号(在 1 到 10^9之间),按进教室的顺序给出.上课了,老师想知道第 ...

最新文章

  1. MYSQL修改配置,允许远程访问
  2. Java Socket实战之一:单线程通信
  3. 【网页前端设计Front end】CSS入门(看不懂你来打我)
  4. .NET应用迁移到.NET Core(一)
  5. python基础教程博客_Python基础教程_Python入门知识
  6. 【BZOJ4289】Tax,堆优化dijsktra的最短路问题
  7. 【Zookeeper】源码分析之请求处理链(四)之FinalRequestProcessor
  8. 怎么实现单击span时给span添加边框
  9. buffer正确的拼接方式
  10. 计算机类教材的选题策划,电子计算机类科技期刊的选题策划.doc
  11. C语言练习题:算术入门之加减乘除(PTA)
  12. 活著就为改变世界---史蒂夫.乔布斯…
  13. Qt,Linux: 播放声音(aplay)
  14. Codeforces Gym 100015F Fighting for Triangles 状压DP
  15. 自学软件测试怎么样,有前景吗?
  16. 微信公众号验证Token
  17. element ui 的 el-tab 当使用 router-view 时 mounted 执行了多次
  18. Django strftime 时区问题
  19. 机器学习评价指标(1)——灵敏度(sensitivity)/查准率/召回率(Recall)/和特异度(Specificity)
  20. 【建议收藏】一份网络安全面试宝典请查收!!

热门文章

  1. 迷宫问题输出超限反思
  2. Flutter使用CupertinoAlertDialog 报 'alertDialogLabel' was called on null.
  3. 浏览器--如何让登陆页面的表单不默认显示账号和密码
  4. 大数据实验室(大数据基础培训)——基础概念
  5. Apache Tiles 学习(四)、Tiles实战
  6. Leetcode | Binary Tree Maximum Path Sum
  7. SVN 两种存储格式(BDB和FSFS)区别
  8. DateTime 的24小时和12小时制
  9. 常用免费精品Web应用列表(转)
  10. 记录一次frp失效bug