当前位置: 首页 > news >正文

洛谷 P1160:队列安排 ← 数组模拟

【题目来源】
https://www.luogu.com.cn/problem/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

【数据范围】
对于 20% 的数据,1≤N≤10。
对于 40% 的数据,1≤N≤1000。
对于 100% 的数据,1<M≤N≤10^5。

【算法分析】
● 本题利用数组模拟实现双链表的代码思想,与“AcWing 827:双链表”的思想基本一致。详见:https://blog.csdn.net/hnjzsyjyj/article/details/150845789

● 本题利用数组模拟实现双链表的示意图,附设了 idx=0 及 idx=1 两个结点。之后,插入结点 2(idx=2)的示意图如下所示。

P1160

● 特别要注意,本题在删除某个结点时,要进行特判,看看待删结点是否还存在。若不存在,忽略此删除操作。

● 本题用 STL list 实现的代码,详见:https://blog.csdn.net/hnjzsyjyj/article/details/151970421

【算法代码】

#include <bits/stdc++.h>
using namespace std;const int maxn=1e5+5;
int le[maxn],ri[maxn],v[maxn],idx;
bool st[maxn];
int n,m,k,q,x;void init() {ri[0]=1,le[1]=0;idx=2;
}void insert(int p,int x) {v[idx]=x;le[idx]=p,ri[idx]=ri[p];le[ri[p]]=idx,ri[p]=idx++;
}void remove(int k) {ri[le[k]]=ri[k];le[ri[k]]=le[k];
}int main() {init();insert(0,1);cin>>n;for(int i=2; i<=n; i++) {cin>>k>>q;if(q) insert(k+1,i);else insert(le[k+1],i);}cin>>m;while(m--) {cin>>x;if(!st[x]) {remove(x+1);st[x]=true;}}for(int i=ri[0]; i!=1; i=ri[i]) {cout<<v[i]<<" ";}return 0;
}/*
in:
4
1 0
2 1
1 0
2
3
3out:
2 4 1
*/





【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/150845789
https://blog.csdn.net/hnjzsyjyj/article/details/151970421
https://www.luogu.com.cn/problem/solution/P1160​​​​​​​
https://blog.csdn.net/lq1990717/article/details/127429719




http://www.jsqmd.com/news/364781/

相关文章:

  • 小白版详解:剪枝怎么评好坏?怎么判断该剪谁?
  • 2026年北京VIP陪诊公司权威测评,高品质服务机构精选 - 品牌鉴赏师
  • 三种剪枝算法流程
  • 【含文档+PPT+源码】基于微信小程序的驾考在线学习与测试系统的设计与实现
  • 2026.02.10
  • 【Matlab】MATLAB 图形标注教程:title、xlabel、ylabel 用法详解与实战
  • 小鼠CD185抗体如何助力CXCR5靶向ADC药物的研发与机制探索?
  • Node.js 编程实战:路径模块(path)详解 - 教程
  • 一文读懂分辨率:从概念到硬件应用,解锁视觉体验新高度 - 详解
  • 2026年布袋除尘器厂商推荐:不锈钢脉冲式布袋除尘器厂家哪家靠谱 - 栗子测评
  • ollydbg脚本学习
  • Java 算法
  • 4022:【GESP2309五级】巧夺大奖
  • 什么是强连通图
  • 【完整源码+数据集+部署教程】交通工具与动物实例分割系统源码&数据集分享 [yolov8-seg-C2f-SCConv&yolov8-seg-repvit等50+全套改进创新点发刊_一键训练教程_W
  • 【完整源码+数据集+部署教程】垃圾分类分割系统源码&数据集分享 [yolov8-seg-GFPN&yolov8-seg-timm等50+全套改进创新点发刊_一键训练教程_Web前端展示]
  • 【完整源码+数据集+部署教程】条形码图像分割系统源码&数据集分享 [yolov8-seg-SPDConv&yolov8-seg-swintransformer等50+全套改进创新点发刊_一键训练教程
  • 追更 HelloGitHub 一整年,终于等到了这篇年度盘点
  • 【完整源码+数据集+部署教程】手势分割系统源码&数据集分享 [yolov8-seg-C2f-ODConv&yolov8-seg-C2f-DCNV3等50+全套改进创新点发刊_一键训练教程_Web前端
  • 基于Java的微影院数字影厅智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • 【完整源码+数据集+部署教程】钢管缺陷分割系统源码&数据集分享 [yolov8-seg-RevCol&yolov8-seg-EfficientHead等50+全套改进创新点发刊_一键训练教程_Web
  • 基于Java的微聊智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • 基于Java的微型水电站监管智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • 完整教程:2025年优化算法:多策略改进蛇优化算法( Improved Snake Optimizer,ISO)
  • 超越Git:迈向数据驱动的机器学习模型版本管理
  • 2007—2024年基于ADB投入产出表计算的生产链长度数据+代码
  • 2000-2025年县域5A级旅游景区DID
  • 2016-2025年地级市绿色数字中心政策数据DID
  • No150:AI中国故事-对话沈括——博学实证与AI认知:跨界融合与科学方法
  • 【计算机网络】NAT技能深度解析:从原理到NAPT实现的工作机制