1513 : 琪露诺的排卡教室
题目描述Description
题目背景
人间之里新开了一家机厅,最近因为乌蒙机子太火,门口总是围满了人。
这天,琪露诺兴冲冲地跑来,打算挑战一下据说“很厉害”的阴游。然而她刚挤到机子旁边,就被告知:
“小孩,要先排卡,按号码来,不然不能上机。”
琪露诺当场愣住了。
“排卡?那是什么?是新的对战规则吗?”
她看着旁边那一串号码、不断变化的位置,还有时不时被叫去打歌的人,完全搞不清现在到底是谁在前、谁还能玩、谁已经不玩了。
这一切对琪露诺来说都太复杂了。
于是,她只好看向你,认真地问:
“你这么聪明,一定知道现在队伍到底是什么情况吧?帮我看看,我什么时候能玩到嘛!”
题目概况
由于乌蒙最多只能让2个人上机游玩,而机厅常常会有大B队(就是很多人) 所以会有一个用来排队的系统,该系统可视为3个部件组成:
- 公卡堆:一个抽象的号码池。每次从中取出当前最小的号码分配给新玩家。
- 排卡区:一个队列,存放已取出的卡片,代表排队顺序。队首是最先被轮询到的卡片。
- 机厅内部:记录当前有哪些玩家在厅内等待(上机游玩本身不改变等待状态,除非玩家主动离开)。
玩家与卡片的关系
每位玩家拥有一张号码唯一的卡片。卡片在排卡区中的位置代表其轮询次序,而玩家本人可能处于三种状态之一:
- 在机厅等待(可被游戏叫号选中);
- 暂时离开(卡仍在队列中,但叫号时会跳过);
- 已注销(卡已从队列移除并归还公卡堆,玩家不再参与排队)。
每位玩家来到机厅时,会从公卡堆中取出当前编号最小的卡,然后将这张卡放入排卡区的末尾。 这张卡代表该玩家在排队,同时该玩家进入机厅等待。
初始状态
由于 10 点机厅刚开门。所以排卡区为空,而公卡堆中包含编号为 1,2,3,…,998244353 的卡。 随后有 n 名玩家“堵门”,她们会立刻涌入机厅并排卡(等效于连续执行 n 次操作1)。 随后处理 q 次操作。
操作定义
| 操作类型 | 参数 | 描述 |
|---|---|---|
1 |
无 | 新玩家到来。从公卡堆取出最小号码的卡片,将该卡放入排卡区末尾,并标记此玩家“在机厅等待”。 |
2 |
p |
卡号为 p
的玩家暂时离开机厅。将其状态改为“离开”,但卡片仍留在排卡区原位置。 |
3 |
p |
卡号为 p
的玩家回到机厅。将其状态改回“在机厅等待”。 |
4 |
p |
卡号为 p
的玩家永久离开。将其状态设为“已注销”,同时从排卡区队列中删除该卡片,并将卡号
p 归还公卡堆(可供后续新玩家使用)。 |
5 |
p |
查询卡号为 p
的卡片当前在排卡区中的位置序号(从队首开始计为第1位)。 |
6 |
x |
开始一局游戏,需要选出 x
名玩家上机( x=1 或 2 )。执行轮询过程直到选中恰好 x 名“在机厅等待”的玩家: ① 将排卡区队首卡片移动到队尾; ② 若该卡片对应的玩家当前状态为“在机厅等待”,则该玩家被选中上机(状态不变)。 输出这 x 名玩家对应的卡号。 |
保证所有操作合法(例如离开/回来时玩家状态符合逻辑,叫号时机厅内等待人数足够,操作5时保证查询卡号的卡片在排卡区等等)。
输入格式Input
第一行两个非负整数 n,
q,表示初始排卡人数与后续操作次数。
接下来 q
行,每行一个操作,格式如上表。
若 op ≠ 1,则紧跟一个正整数参数。
输出格式Output
对于每个操作5,输出一行一个整数表示卡片位置。
对于每个操作6,输出一行,包含 x
个整数,表示被选中玩家的卡号(按选中顺序排列)。
样例Sample
提示Hint
样例解释
| 操作 | 操作后队列 | 输出 |
|---|---|---|
| 初始 | [1,2,3,4,5,6] | — |
2 2 |
[1,\underline{2},3,4,5,6] | — |
2 3 |
[1,\underline{2},\underline{3},4,5,6] | — |
2 4 |
[1,\underline{2},\underline{3},\underline{4},5,6] | — |
6 2 |
[6,1,\underline{2},\underline{3},\underline{4},5] | 1 5 |
4 1 |
[6,\underline{2},\underline{3},\underline{4},5] | — |
1 |
[6,\underline{2},\underline{3},\underline{4},5,1] | — |
3 3 |
[6,\underline{2},3,\underline{4},5,1] | — |
6 2 |
[\underline{4},5,1,6,\underline{2},3] | 6 3 |
5 1 |
[\underline{4},5,1,6,\underline{2},3] | 3 |
6 2 |
[6,\underline{2},3,\underline{4},5,1] | 5 1 |
说明:带下划线的数字(如 \underline{2})表示该玩家暂时离开,卡仍在队列中但叫号时跳过。操作
6 选中玩家后会改变队列顺序,但不会删除卡片。操作
4 永久离开会从队列中移除卡片。
数据规模
0 \le n, q \le 2\times 10^5
出题Author
akl9
来源Source
深圳技术大学第六届程序设计竞赛