P1160 队列安排题解
一、双链表示意图
二、C++代码
#include <bits/stdc++.h>
using namespace std;
//双链表模板
const int N = 100010;
int e[N]; //数据
int l[N]; //左链表
int r[N]; //右链表
int idx; //准备放入的索引值
//正整数x,表示将x号同学从队列中移去,如果x号同学已经不在队列中则忽略这一条指令。
//正是因为有了这句话,如果没有删除的标识了,真的有重复指令就会让数据出问题。
// 因为可能重复的对左右结点进行操作,造成数据错误。
int st[N]; //删除标识
// 黄海写的题解
// https://www.acwing.com/solution/content/35794/
//0表示头,1表示尾,正式使用的是从idx=2开始
void init() {
//0的右端是1,1的左端是0
r[0] = 1, l[1] = 0, idx = 2;
}
//函数含义:在k号节点右侧插入,值为x
//如果想实现:在k号节点左侧插入,值为x 则调用:add(l[k],x),意义为在k的左侧,
//相当于在k的左侧节点的右侧,
void add(int k, int x) {
e[idx] = x; //将x放入到一个空的单元格中
l[idx] = k; //将新增加的单元格的右指针指向k的下一链路节点
r[idx] = r[k]; //将新增加的单元格的左指针指向k
//完成上面两步后,只是让idx这个节点建立了与原来两个节点的关系,而原来的两个k与r[k],
// l[r[k]]还是旧的值,也需要进行修改。
l[r[k]] = idx;
r[k] = idx;
//为下一次做准备
idx++;
}
//删除第k个节点
void remove(int k) {
r[l[k]] = r[k];
l[r[k]] = l[k];
}
int n, k, p, m, x;
//输出双链表
void print() {
//遍历双向链表的方法
for (int i = r[0]; i != 1; i = r[i]) cout << e[i] << " ";
cout << endl;
}
int main() {
//初始化双链表
init();
//读入
cin >> n;
//先将1号同学安排进队列
//最左端就是表示在head(0号)的右侧插入一个数据
add(0, 1);
for (int i = 2; i <= n; i++) {
//k为小于i的正整数
cin >> k >> p;
//p为0,表示将i号同学插入到k号同学的左边
//p为1,表示将i号同学插入到k号同学的右边
//idx从2开始,所以下标需要k+1传入才对
//就是1号同学的idx=2
//就是2号同学的idx=3
//就是3号同学的idx=4
//就是k号同学的idx=k+1
//右边就是正常的add(k+1,i)
//左边稍有一点变化:add(l[k+1],i), 表示在当前号的左侧那个,就是它的前面结点的右侧放入
if (p == 0) add(l[k + 1], i);
else add(k + 1, i);
}
//表示去掉的同学数目
cin >> m;
for (int i = 1; i <= m; i++) {
cin >> x;
//表示将x号同学从队列中移去
if (!st[x + 1]) {
remove(x + 1);
st[x + 1] = 1;
}
}
//输出链表 (表示了队列从左到右所有同学的编号,行末换行且无空格)
print();
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2016-07-29 承诺的功能
2016-07-29 WINFORM写入COOKIE
2015-07-29 云平台的项目管理工作该如何走?
2014-07-29 比对两个Word文件内容是否一致的C#解决办法
2013-07-29 内网能PING通TELNET通不能访问解决