A6772 | 「THUPC 2024」机器人
来源官方 / 2024
时间限制2s
内存限制1024MB
通过 / 提交0/0
题目描述
有 $n$ 个机器人围成一圈,编号按照逆时针顺序分别为 $0\sim n-1$。
每个机器人有两只手。编号为 $i$ 的机器人初始「左手」指向编号 $l_i$ 的机器人,「右手」指向编号 $r_i$ 的机器人。
所有的机器人内部都写有一条「指令」,「指令」有以下这些形式:
### 指令
下面介绍这些「指令」的格式以及它们被「执行」时的效果。文中的“自己”一词均指拥有这条「指令」的机器人。
-
-
-
-
-
-
-
机器人「执行」各「指令」时的输出格式如下:
- 「摸鱼」时输出
- 「移动」时输出
- 「交换」时输出
- 「切换」时输出
-
你按照一定顺序选择了一些机器人(可能重复选择)并「执行」了对应机器人的「指令」,得到了「执行」的**完整**输出,也就是说,在「执行」完输出中最后一条「指令」之后,没有其他「指令」被「触发」。但是,你忘记了你选择机器人的顺序,也忘了每个机器人开始时有什么「指令」。你只记得机器人的总数以及开始时每个机器人的手指向什么位置。
你想通过已知的所有信息还原出最初所有机器人的「指令」都是什么。
每个机器人有两只手。编号为 $i$ 的机器人初始「左手」指向编号 $l_i$ 的机器人,「右手」指向编号 $r_i$ 的机器人。
所有的机器人内部都写有一条「指令」,「指令」有以下这些形式:
### 指令
下面介绍这些「指令」的格式以及它们被「执行」时的效果。文中的“自己”一词均指拥有这条「指令」的机器人。
-
SLACKOFF:**「摸鱼」**,即什么也不做。-
MOVE h z:将第 $h$ 只手向逆时针方向 **「移动」** $z$ 个机器人的位置。当 $h=0$ 时表示「左手」,当 $h=1$ 时表示「右手」,下同。-
SWAP:**「交换」** 双手指向的机器人的「指令」。-
TRIGGER <COMMANDNAME>: <COMMAND>:其中 <COMMANDNAME> 为 SLACKOFF、MOVE、SWAP、TRIGGER、TOGGLETRIGGERREPLACE 之一;<COMMAND> 表示一条完整的非 TRIGGER 「指令」。TRIGGER 指令本身不会被「执行」,但是,当一个**其他**机器人「执行」完一条「指令」之后,且「右手」指向自己的时候,自己满足如下条件的 TRIGGER 指令(如果有)就会被 **「触发」** ——「执行」一次对应的 <COMMAND>:-
<COMMANDNAME> 不为 TRIGGER 时,刚刚「执行」完毕的「指令」为 <COMMANDNAME> 指令;-
<COMMANDNAME> 为 TRIGGER 时,刚刚「执行」完毕的「指令」是一条 TRIGGER 指令被「触发」时,「执行」的 <COMMAND> 部分。-
TOGGLETRIGGERREPLACE h <COMMANDNAME> <NEWCOMMAND>:如果第 $h$ 只手指向的机器人的「指令」是 TRIGGER 指令,则将其 **「切换」** 为该「指令」的 <COMMAND> 部分,即删去前面的 TRIGGER 及条件部分;如果这条「指令」不是 TRIGGER 指令,假设是 <COMMAND>,则将其「切换」为 TRIGGER <COMMANDNAME>: <COMMAND>。其中 <COMMANDNAME> 为 SLACKOFF、MOVE、SWAP、TRIGGER、TOGGLETRIGGERREPLACE 之一。然后将自己的「指令」(注意这可能不仅仅包含正在「执行」的那部分「指令」)修改为 <NEWCOMMAND>。其中,<NEWCOMMAND> 是一条完整的「指令」。机器人「执行」各「指令」时的输出格式如下:
- 「摸鱼」时输出
Robot <id> slacks off.。其中 <id> 为一个整数,表示「执行」当前「指令」的机器人编号,下同。- 「移动」时输出
Robot <id> moves its <side> hand towards Robot <id2>.。其中 <side> 为 left 或 right,表示移动了哪只手(left 表示「左手」,right 表示「右手」);<id2> 为一个整数,表示移动之后这只手指向的机器人的编号。- 「交换」时输出
Robot <id> swaps the commands of Robot <id2> and Robot <id3>.。其中 <id2> 和 <id3> 为整数,表示被「交换」「指令」的机器人编号,这两个数可以按任意顺序输出。- 「切换」时输出
Robot <id> toggles the trigger property of the command of Robot <id2>。-
TRIGGER 指令不会被「执行」,但当它们被「触发」时,会按照上面的格式输出对应的「指令」被「执行」的信息。你按照一定顺序选择了一些机器人(可能重复选择)并「执行」了对应机器人的「指令」,得到了「执行」的**完整**输出,也就是说,在「执行」完输出中最后一条「指令」之后,没有其他「指令」被「触发」。但是,你忘记了你选择机器人的顺序,也忘了每个机器人开始时有什么「指令」。你只记得机器人的总数以及开始时每个机器人的手指向什么位置。
你想通过已知的所有信息还原出最初所有机器人的「指令」都是什么。
输入格式
第一行两个正整数 $n,k$,其中 $k$ 表示输出的总行数。
接下来 $n$ 行,每行两个整数 $l_i,r_i$,按编号从小到大的顺序输入。
接下来 $k$ 行,每行一条「执行」「指令」的输出信息。
为了减轻处理输入的负担,输出信息被简化如下(没有特殊声明的参数信息含义同上):
- 「摸鱼」时输出
- 「移动」时输出
- 「交换」时输出
- 「切换」时输出
-
输入保证存在一组初始的「指令」,使得存在一种选择机器人的方式,能够得到对应的输出。
保证 $1\le n,k \le 500000$。
保证 $0\le l_i,r_i<n$。
接下来 $n$ 行,每行两个整数 $l_i,r_i$,按编号从小到大的顺序输入。
接下来 $k$ 行,每行一条「执行」「指令」的输出信息。
为了减轻处理输入的负担,输出信息被简化如下(没有特殊声明的参数信息含义同上):
- 「摸鱼」时输出
SLACKOFF <id>。- 「移动」时输出
MOVE <id> <side> <id2>。其中 <side> 为 0 或 1,表示移动了哪只手(0 表示「左手」,1 表示「右手」)。- 「交换」时输出
SWAP <id> <id2> <id3>。- 「切换」时输出
TOGGLETRIGGERREPLACE <id> <id2>。-
TRIGGER 指令不会被「执行」,但当它们被「触发」时,会按照上面的格式输出对应的「指令」被「执行」的信息。输入保证存在一组初始的「指令」,使得存在一种选择机器人的方式,能够得到对应的输出。
保证 $1\le n,k \le 500000$。
保证 $0\le l_i,r_i<n$。
输出格式
输出 $n$ 行,按编号从小到大输出机器人最初的「指令」,每条一行。
你需要保证「指令」格式正确,且 $0\le z < n$。
你需要保证你的输出文件不能过大。若你的输出文件大小不超过 $100\texttt{MB}$,则一定能保证 Special Judge 能够正确返回结果。
此外任何能够得到输入中 $k$ 行输出的答案均算作正确。
你需要保证「指令」格式正确,且 $0\le z < n$。
你需要保证你的输出文件不能过大。若你的输出文件大小不超过 $100\texttt{MB}$,则一定能保证 Special Judge 能够正确返回结果。
此外任何能够得到输入中 $k$ 行输出的答案均算作正确。
输入输出样例
输入 #1
4 7 1 3 2 0 3 0 2 1 SWAP 1 0 2 SWAP 0 1 3 SWAP 1 2 0 MOVE 0 0 2 SWAP 1 0 2 SWAP 0 2 3 MOVE 3 0 3
输出 #1
MOVE 0 1 SWAP TRIGGER SWAP: SWAP SWAP
输入 #2
4 7 1 2 2 3 3 1 0 2 TOGGLETRIGGERREPLACE 0 1 SLACKOFF 3 MOVE 0 1 3 SWAP 1 2 3 TOGGLETRIGGERREPLACE 3 2 SLACKOFF 2 SLACKOFF 3
输出 #2
TOGGLETRIGGERREPLACE 0 MOVE MOVE 1 1 TRIGGER SLACKOFF: SWAP TRIGGER SWAP: TOGGLETRIGGERREPLACE 1 TOGGLETRIGGERREPLACE SLACKOFF SLACKOFF
输入 #3
4 4 2 1 1 2 0 3 1 3 SLACKOFF 0 SLACKOFF 1 SLACKOFF 2 SLACKOFF 3
输出 #3
SLACKOFF TRIGGER SLACKOFF: SLACKOFF TRIGGER SLACKOFF: SLACKOFF TRIGGER TRIGGER: SLACKOFF
暂无题解
C++ 编辑器
输入
输出
可保存默认模板;新题优先使用已保存模板。
当前快捷键仅展示,暂不支持修改。
- 撤销
Ctrl / ⌘ + Z - 重做
Ctrl / ⌘ + Y - 查找
Ctrl / ⌘ + F - 全选
Ctrl / ⌘ + A - 复制
Ctrl / ⌘ + C - 剪切
Ctrl / ⌘ + X - 粘贴
Ctrl / ⌘ + V - 自动排版
工具栏排版按钮 - 草稿保存
编辑时自动保存到本机
历史
提交记录
状态说明时间源码
AI
作答助手
你好,我是作答助手。可以问思路、复杂度、样例含义或代码报错原因;不会直接给出完整 AC 代码。
确定要清空代码吗?