P1160 队列安排题解

news2024/9/20 22:41:44

题目

一个学校里老师要将班上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.coloradmin.cn/o/1480495.html

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

相关文章

我写了个ImageWindow应用

文章目录 0 引言1 应用简介2 主要功能和特点2.1 多图像同/异步像素级对比2.2 支持多达30种图像格式2.3 高效率的图像处理性能 3 简明使用教程3.1 软件下载安装与更新3.1.1 软件下载与安装3.1.2 软件更新 3.2 多视窗添加并自动最优排列3.3 多样化图像导入方式3.4 自动切换显示模…

如何实现WordPress后台显示文章、分类目录、标签等的ID?

我们平时在使用WordPress的过程中&#xff0c;偶尔需要用到文章的ID&#xff0c;或分类目录ID&#xff0c;或标签ID&#xff0c;或媒体库ID&#xff0c;或评论ID&#xff0c;或用户ID等&#xff0c;但是WordPress后台默认是不显示它们的ID的。 今天boke112百科就跟大家分享如何…

Linux 下安装Jupyter

pip3 install jupyter pip3 install ipython -------------------------------------------- pip3 install jupyterlab jupyter lab pip3 list | grep jupyterlab 启动&#xff1a; python3 -m jupyter lab 2.安装朱皮特 pip3 install -i https://pypi.douban.com/simpl…

力扣1107 每日新用户统计

力扣SQL查询案例——在过去90天内&#xff0c;每个日期首次登录的用户数 目录 题目描述 解题思路 完整代码 题目描述 Traffic 表&#xff1a; ------------------------ | Column Name | Type | ------------------------ | user_id | int | | activity …

计算机二级MySQL-错题、知识点合集04

计算机二级MySQL 第四章 索引 主键约束&#xff0c;不允许为空也不允许重复。 NOT NULL非空约束属于自定义完整约束 PRIMARY KEY 属于实体完整性约束 FOREIGN KEY外键约束 外键与其引用的主键应分别属于不同的表&#xff0c;可以属于同一个关系&#xff1b;一个关系中可以定…

如何在Window系统部署BUG管理软件并结合内网穿透实现远程管理本地BUG

文章目录 前言1. 本地安装配置BUG管理系统2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射本地服务3. 测试公网远程访问4. 配置固定二级子域名4.1 保留一个二级子域名5.1 配置二级子域名6. 使用固定二级子域名远程 前言 BUG管理软件,作为软件测试工程师的必备工具之一。在…

css5定位

css 一.定位1.概念&#xff08;定位定位模式边位移&#xff09;2.静态位移static&#xff08;不常用&#xff09;3.相对定位relative&#xff08;不脱标&#xff09;&#xff08;占位置&#xff09;4.绝对定位absolute&#xff08;脱标&#xff09;&#xff08;不占位置&#x…

Unity(第十七部)Unity自带的角色控制器

组件Character Controller 中文角色控制器 using System.Collections; using System.Collections.Generic; using UnityEngine;public class player : MonoBehaviour {private CharacterController player;void Start(){player GetComponent<CharacterController>();}v…

leetcode刷题(javaScript)——栈相关场景题总结

在LeetCode刷题中&#xff0c;栈是一个非常有用的数据结构&#xff0c;可以解决许多问题&#xff0c;包括但不限于以下几类问题&#xff1a; 括号匹配问题&#xff1a;例如检查括号序列是否有效、计算表达式的值等。逆波兰表达式求值&#xff1a;使用栈来实现逆波兰表达式的计算…

Linux线程【1概念】

目录 前言&#xff1a; 正文&#xff1a; 1.什么是线程&#xff1f; 1.1基本概念 1.2线程理解 1.3进程与线程的关系 1.4线程使用 2.重谈地址空间 2.1页表的大小 2.2、内存与磁盘的交互 2.3深入页表 2.4小结 3.线程概念总结 3.1、再谈线程 3.2线程的优点 3.3…

MYSQL 解释器小记

解释器的结果通常通过上述表格展示&#xff1a; 1. select_type 表示查询的类型 simple: 表示简单的选择查询&#xff0c;没有子查询或连接操作 primary:表示主查询&#xff0c;通常是最外层的查询 subquery :表示子查询&#xff0c;在主查询中嵌套的查询 derived: 表示派…

pip降级在pycharm中

PyCharm依赖于"–build-dir"参数安装第三方库&#xff0c;但该参数在最新的23.0版pip中已删除 解决办法就是降级pip&#xff0c;PyCharm中选择File&#xff0c;找到编译器&#xff0c;点击pip&#xff0c;勾选对应版本即可 或者在cmd中执行运行python -m pip install…

android开发软件下载,2024年Android开发陷入饱和

谈起性能优化&#xff0c;我想问&#xff0c; 什么是性能优化&#xff1f;你的理解呢&#xff1f; **首先什么是性能&#xff1a;**在同一个手机里面&#xff0c;同样功能的app&#xff0c;哪个跑的快&#xff0c;哪个不卡&#xff0c;哪个就性能高。我们这篇文章就是解决那些…

SQL注入漏洞解析--less-6

1.第六关了。 2.这个和第五关有点像&#xff0c;只是换成了双引号&#xff0c;接下来的都一样&#xff0c;看我操作(换个函数试一下extractvalue&#xff0c;他的报错位置在第二个&#xff0c;那我就利用一下) 3.爆库名 ?id1"%20and%20extractvalue(1,concat(0x7e,(sele…

后地产时代,卫浴品牌有何变革之道?

联系与卫浴密切相关的房地产行业现状来看&#xff0c;卫浴行业正处于变革期。 国家统计局数据显示&#xff0c;2023年&#xff0c;商品房销售面积111735万平方米&#xff0c;比上年下降8.5%&#xff0c;其中住宅销售面积下降8.2%&#xff1b;商品房销售额116622亿元&#xff0…

低功耗微处理器复位检测电路,工作温度范围-40~+80℃,可与μP监控产品兼容——D706

近年来&#xff0c;微处理器在IT业控制领域和智能化产品中得到了广泛的应用。在系统和产品的开发设计过程中&#xff0c;为了提高其抗干扰能力&#xff0c;使用μP监控是首选技术措施之一。监控芯片可为系统提供上电、掉电复位功能&#xff0c;也可提供其它功能&#xff0c;如后…

二分通用模板+例题java

&#x1f9e1;&#x1f9e1;二分大前提&#x1f9e1;&#x1f9e1; 有序数列&#xff01;&#xff01; &#x1f9e1;&#x1f9e1;模板&#x1f9e1;&#x1f9e1; 查找具体某个元素 while(left<right) &#xff1a;三个分支&#xff0c;在循环里直接返回答案 //二分查找具…

JSON 文件里的 “$schema” 是干什么用的?

最近我在做一些前端项目&#xff0c;我发现有的配置文件&#xff0c;比如 .prettierrc.json 或者 tsconfig.json 里面都会看到一个 $schema 字段&#xff0c;有点好奇&#xff0c;就查了一下。 什么是 JSON Schema JSON Schema是一种基于JSON (JavaScript Object Notation) 的…

电梯物联网之梯控相机方案-防止电瓶车进电梯

梯控现状 随着电梯产品在智能化建筑的日益普及,对于电梯的智能化管理 安全性需求 的要求越来越迫切。尤其今年来随着电瓶车的大量普及&#xff0c;发起多起楼道、轿厢电瓶车着火恶性事件&#xff0c; 造成了极大的社会 负面影响。控制电瓶车进入单元门&#xff0c;楼道以及电梯…

浅析智能照明控制系统在图书馆照明节能中的应用

彭姝麟 Acrelpsl 0 引 言 照明耗电在各国总发电量中都占有很大比例&#xff0c;根据2004年国家住房和城乡建设部的统计&#xff0c; 我国照明耗电约占全国发电总量的10&#xff05;一12&#xff05;。 对一些照明时间较长、照明场所较多的机构&#xff0c;如高等学校&#xf…