P1160 队列安排题解

题目

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

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

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

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

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

输入输出格式

输入格式

第一行一个整数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号同学已经不在队列中则忽略这一条指令。

输出格式

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

输入输出样例

输入样例

4
1 0
2 1
1 0
2
3
3

输出样例

2 4 1

补充知识

链表的使用,可以完成以下的操作,实现一个数据结构,维护一张表(最初只有一个元素1)。支持以下的操作,其中x,y都是int范围内的正整数,且都不一样。

(1)ins_back(x,y):将元素y插入到x后面

(2)ins_front(x,y):将元素y插入到x前面

(3)ask_back(x):询问x后面的元素

(4)ask_front(x):询问x前面的元素

(5)del(x):从表中删除元素x,不改变其他元素的先后顺序

struct node{int pre,nxt;//分别记录前驱和后继结点在数组s中的下标int key;node(int _key=0,int _pre=0,int _nxt=0){pre=_pre;nxt=_nxt;key=_key;}
};
node s[100005];
//一个池,以后想要新建一个结点,就从s数组里面拿出一个位置给新结点
//也可以使用指针new,delete实现
int tot=0;//记录s数组目前使用了多少个位置,那么下一个可用的位置就是s[tot+1]
int find(int x){//查找x的结点编号,需要遍历整个链表int now=1;while(now&&s[now].key!=x){now=s[now].nxt;return now;} 
} 
void ins_back(int x,int y){//y插在x后面 int now=find(x);s[++tot]=node(y,now,s[now].nxt);s[s[now].nxt].pre=tot;s[now].nxt=tot;
}
void ins_front(int x,int y){//y插在x前面 int now=find(x);s[++tot]=node(y,s[now].pre,now);s[s[now].pre].nxt=tot;s[now].pre=tot;
}
int ask_back(int x){int now=find(x);return s[s[now].nxt].key;
}
int ask_front(int x){int now=find(x);return s[s[now].pre].key;
}
void del(int x){int now=find(x);int le=s[now].pre,rt=s[now].nxt;s[le].nxt=rt;s[rt].pre=le;
}

当然STL库也提供了链表的相关操作,需要使用list的头文件。支持以下的常用方法。

(1)list<int> a:定义一个int类型的链表a

(2)int arr[5]={1,2,3};lsit<int> a(arr,arr+3):从数组arr中的前三个元素作为链表a的初始值

(3)a.size():返回链表的结点数量

(4)list<int>::iterator it:定义一个名为it的迭代器(指针)

(5)a.begin();a.end():链表开始和末尾的迭代器指针

(6)it++;it--:迭代器指向前一个和后一个元素

(7)a.push_front(x);a.push_back():在链表开头或者末尾插入元素x

(8)a.insert(it,x):在迭代器it的前插入元素x

(9)a.pop_front();a.pop_back():删除链表开头或者末尾

(10)a.erase(it):删除迭代器it所在的元素

(11)for(it=a.begin();it!=a.end();it++):遍历链表

解析

此题目利用一个双向链表维护这个队伍,每个同学记录自己左边和右边的同学。这样各种操作都可以O\left ( 1 \right )的复杂度完成。可以使用上面的链表模板,但是需要稍微修改一下插入函数和删除函数。使用数组index定位某位同学的结点编号,在插入和删除时直接找到这位同学的结点编号,在插入时还要记录下这名同学的结点编号。这样就不需要每次都要遍历整个链表了。

#include<iostream>
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;s[now].nxt=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();//令0恒为最左边的结点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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/711503.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

下载huggingface数据集到本地并读取.arrow文件遇到的问题

文章目录 1. 524MB中文维基百科语料&#xff08;需要下载的数据集&#xff09;2. 下载 hugging face 网站上的数据集3. 读取 .arrow 文件报错代码4. 纠正后代码 1. 524MB中文维基百科语料&#xff08;需要下载的数据集&#xff09; 2. 下载 hugging face 网站上的数据集 要将H…

MATLAB环境下一种新颖的类脉冲信号的高分辨率时频分析方法

一般情况下&#xff0c;机械振动信号或地震信号是非平稳的。而传统傅立叶变换只能应用于平稳信号分析&#xff0c;故不适用于非平稳信号。所以&#xff0c;我们需要采用时频分析方法。时频分析方法能达到同时在时间域和频率域对信号进行分析的目的&#xff0c;得到信号在不同时…

Python爬取网站视频资源

思路&#xff1a; 在界面找到视频对应的html元素位置&#xff0c;观察发现视频的url为https://www.pearvideo.com/video_视频的id&#xff0c;而这个id在html中的href中&#xff0c;所以第一步需要通过xpath捕获到所需要的id 在https://www.pearvideo.com/video_id的页面&…

线程池学习

github看到一个项目&#xff08;GitHub - markparticle/WebServer: C Linux WebServer服务器&#xff09;&#xff0c;内部使用的一个线程池看着不错&#xff0c;拿来学习一下。 /** Author : mark* Date : 2020-06-15* copyleft Apache 2.0*/ #ifndef THREADPO…

Windows系统搭建VisualSVN并结合内网穿透实现远程访问本地服务

文章目录 前言1. VisualSVN安装与配置2. VisualSVN Server管理界面配置3. 安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4. 固定公网地址访问 前言 SVN 是 subversion 的缩写&#xff0c;是一个开放源代码的版本控制系统…

Spring 事务常见错误(上)

通过上一章的学习&#xff0c;我们了解了 Spring Data 操作数据库的一些常见问题。这一章我们聊一聊数据库操作中的一个非常重要的话题——事务管理。 Spring 事务管理包含两种配置方式&#xff0c;第一种是使用 XML 进行模糊匹配&#xff0c;绑定事务管理&#xff1b;第二种是…

洗澡、泡脚真的能养生? 皮肤科医生来科普

现如今人们越来越注重健康与养生&#xff0c;除了枸杞、生姜等食补外&#xff0c;各种保健方法和保健产品也层出不穷&#xff0c;还有泡脚、洗凉水澡等养生延缓衰老的方式也广泛流行&#xff0c;那么泡脚与洗凉水澡真的有用吗?西安国际医学中心医院皮肤科主任高鹏程特意进行了…

Timeplus-proton流处理器调研

概念 Timeplus是一个流处理器。它提供强大的端到端功能&#xff0c;利用开源流引擎Proton来帮助数据团队快速直观地处理流数据和历史数据&#xff0c;可供各种规模和行业的组织使用。它使数据工程师和平台工程师能够使用 SQL 释放流数据价值。 Timeplus 控制台可以轻松连接到不…

女性三八节礼物攻略:她无法抗拒的五大礼物

随着春风的温柔拂面&#xff0c;我们即将迎来一年一度的三八国际妇女节。这个特别的日子&#xff0c;不仅是对女性贡献的认可和庆祝&#xff0c;也是向我们生命中的女性表达感激和爱意的绝佳时机。在这个充满温馨和敬意的时刻&#xff0c;我们常常在思考&#xff0c;如何用一份…

elementUI el-table中的对齐问题

用elementUI时&#xff0c;遇到了一个无法对齐的问题&#xff1a;代码如下&#xff1a; <el-table :data"form.dataList" <el-table-column label"验收结论" prop"checkResult" width"200"> <template slot-sco…

揭秘!Excel如何成为职场中的价值创造利器

文章目录 一、Excel在生产力提升中的作用二、Excel在创造价值方面的应用案例三、Excel实用技巧分享四、Excel与其他工具的协同应用五、Excel学习的建议与展望《Excel函数与公式应用大全》亮点内容简介作者简介目录 在当今信息爆炸的时代&#xff0c;数据处理和分析能力已成为职…

AI智能分析网关V4智慧商场方案,打造智慧化商业管理生态

AI智能视频检测技术在商场楼宇管理中的应用越来越广泛。通过实时监控、自动识别异常事件和智能预警&#xff0c;这项技术为商场管理提供了更高效、更安全的保障。今天我们以TSINGSEE青犀视频AI智能分析网关为例&#xff0c;给大家介绍一下AI视频智能分析技术如何应用在商场楼宇…

抢单情况下的均衡分配机制

背景&#xff1a; 1、工单有多种类型。 2、客户提交工单。 3、不同客服受理不同类型工单&#xff0c;受理工单类型存在交叉。 4、按照类型维度实现均衡分配。 方案&#xff1a; 1、为每种类型创建一个工单池&#xff0c;使用队列&#xff0c;左进右出&#xff1b;客户提交…

将所有字母转化为该字母后的第三个字母,即A->D,B->E

//编写加密程序&#xff0c;规则&#xff1a;将所有字母转化为该字母后的第三个字母&#xff0c;即A->D,B->E,C->F,…Y->B,Z->C //小写字母同上&#xff0c;其他字符不做转化。输入&#xff1a;I love 007 输出&#xff1a;L oryh 007 代码&#xff1a; #inc…

配置MMDetection的solov2攻略整理

目录 一、MMDetection 特性 常见用法 二、ubuntu20.04配置solov2 三、Windows11配置solov2 一、MMDetection MMDetection是一个用于目标检测的开源框架&#xff0c;由OpenMMLab开发和维护。它提供了丰富的预训练模型和模块&#xff0c;可以用于各种目标检测任务&#xff…

redis的基本数据类型(一)

redis的基本数据类型 1、redis1.1、数据库分类1.2、NoSQL分类1.3、redis简介1.4、redis应用1.5、如何学习redis 2、redis的安装2.1、Windows安装2.2.1、客户端redis管理工具 2.2、Linux安装&#x1f525;2.2.1、redis核心文件2.2.2、启动方式2.2.3、redis桌面客户端1、redis命令…

Python进阶学习:Pickle模块--dump()和load()的用法

Python进阶学习&#xff1a;Pickle模块–dump()和load()的用法 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您…

ASO 对App产品性能的影响

可发现性 拥有出色的App还不足以让人们发现它&#xff0c;ASO技术通过提高搜索排名来增强App的可发现性。当用户可以在搜索结果中轻松找到应用程序时&#xff0c;那么下载和成功的潜力就会飙升。 设定期望 实施有效的应用商店优化不仅可以为潜在用户建立正确的期望&#xf…

东方通 | 基于TongWeb中间件适配改造实战

东方通 一、东方通[Tong Web] 简介 ​为了方便地开发、部署、运行和管理Internet上基于三层/多层结构的应用&#xff0c;需要以基于组件的底层技术为基础&#xff0c;规划一个整体的应用框架&#xff0c;提供相应的支撑平台&#xff0c;作为Internet应用的基础设施&#xff0…

每日一类:Qt GUI开发的基石《QWidget》

深入探索QWidget&#xff1a;Qt GUI开发的基石 在Qt框架中&#xff0c;QWidget类扮演着构建图形用户界面&#xff08;GUI&#xff09;的基础角色。它不仅提供了窗口的基本功能&#xff0c;还允许开发者通过继承和定制来创建各式各样的用户界面元素。本文将详细介绍QWidget的关…