SP15252 MOSTYCOD - Humans Life Code
题目描述
想象一下你是一个人类。
你有一些参数,这些参数存储在一个大数组中。
(实际上,这个数组的大小是 $00963999206048$ 位)。
\[我们暂时不讨论这些参数的具体含义\]
如果你想知道某个参数的值,需要在你的脑海中浏览这个数组,直到找到那个参数的位置。
最重要的是,你要知道你此刻在数组中的哪个位置!
假设你的参数在你不主动修改前是不会改变的
(其实这可以通过浏览数组找到参数位置并更改来实现)。
这里最重要的是了解,在修改之前存储的值是什么。
(为什么呢?因为人类只能通过增加或减少值来改变参数
(你应该知道,人类出生时每个数组位置的初始值都是 $0$))
唯一能知道自己在数组中位置和存储值的方法,就是从出生起一路跟随直到现在。
(人类在地球上的平均寿命约为 $00963113324820$ 毫秒,平均大脑寿命)。
让我们来看看人类的生活:
其实并不复杂,因为时间一直在流逝,人类无法停止时间,也无法倒流。
他们生活中有一个内部栈,用来保存人生的“检查点”。
这些检查点是他们所谓的“做决定”的时刻。
这些点使人生有两种选择:一种是接着继续生活,按计划执行所有事情直到“记忆时间”,
另一种选择是在遇到“记忆时间”时,回到上一个检查点,重复从那时起做过的一切。
(这种选择是他们唯一能回头的时候)
而“记忆时间”是指他们决定是否继续生活或者返回的时刻。
为了模拟人类的生活,我们可以用一种特别的语言写代码。
这种语言称为“莫斯特代码”。
让我们定义人类的 11 种基本行为如下:
- BORN 表示出生(人类生活开始时,内部栈为空,数组中所有位置值为 $0$)
- DIE 表示死亡(人类生命结束时,视其一生所为决定是升入天堂还是坠入地狱)
- ENTER 表示进入内部数组
- 注意:当人在内部数组中时,除非发生特定情况,否则不会死。
- EXIT 表示退出内部数组
- 注意:忽略任何在数组外的操作。
- 注意:首次进入数组时,我们在位置 $0$;否则,停留在上次所在的位置。
- DEEP 表示在思维中更深入一层
- 注意:如果在思维的最深处,再深入则回到位置 $0$(循环模式)。
- FLOAT 表示在思维中上浮一层
- 注意:如果在位置 $0$,再上浮则回到最深处(循环模式)。
- INCREASE 表示当前值加一
- DECREASE 表示当前值减一
- CHECKPOINT 表示做决定的时刻(如前所述)
- MEMORY 表示记忆时间,人类决定是回到检查点还是继续前进。
- 注意:只有在最后访问的位置值不为 $0$ 时,才会执行从 CHECKPOINT 到 MEMORY 的代码。否则会跳过。
每次只跟随一个人类,你需要编写一个程序,在特定时刻输出他思维中所有访问过的位置的值(仅限访问过的)。
使用以下格式输出:
```
位置编号 --> 值
```
何时打印呢?
由于值会随生命的变化而变化,我们定义一个操作 `*****`,表示“自我评估”时刻。
输入是一段人类生活的一部分,假设以下几点:
1. 该人类已经出生,且年龄足够大可以进入他的思维。
2. 他已经进入了内部数组。
3. 他的思维中已有初始值(输入中提供)。
4. 他有一个初始位置(输入中提供)。
5. 在分析过程中,该人类不会退出内部数组。
6. LifeCode(在这个版本中)只包含以下操作:\[DEEP, FLOAT, INCREASE, DECREASE, CHECKPOINT, MEMORY, *****\]
7. *****。
**输入格式:**
第一行包含 $M \ P \ A \ S$(用空格分隔)
- $M$:已访问过的位置数量(第二行将给出这些位置的值)。$0 < M < 50$
- $P$:他在思维中的最后位置。$0 \le P < M$
- $A$:要分析的操作数量。$0 < A < 1000$
- $S$:“自我评估”操作的数量。$0 \le S < 100$
注意:对于每个“自我评估”操作,你需要按下文规定的方式输出所有访问过的位置的值。
第二行提供内部数组的前 $M$ 个值的初始化(从 $0$ 到 $M-1$)。
接下来是 $A$ 个操作,每行最多包含 7 个动作,最后一行可能会少于 7 个。
这些值 $V[0], V[1], \ldots, V[M-1]$ 是 32 位整数(因此 $0-1=-1$ 和 $2147483647+1=-2147483648$)。
**输出格式:**
对于每个“自我评估”操作,你需要按以下格式输出内部数组中访问过的位置的值:
```
位置编号 --> 值
```
如果 `位置编号` 是最后访问的位置,前面加上一个星号 `*`。
注意:人类在位置 $0$ 时不会上浮,否则会死,这是在思维旅行中唯一可能死亡的情况。
**示例:**
**示例 1(简单):**
输入:
```
1 0 7 1
5
DEEP CHECKPOINT MEMORY FLOAT INCREASE DECREASE *****
```
输出:
```
*0 --> 5
1 --> 0
```
说明:我们只改变了位置 $0$,但我们也访问了位置 $1$。
注意没有进入检查点。
茉莉花标记用于标记最后访问的位置。
**示例 2(中等):**
输入:
```
5 2 15 4
0 1 2 3 4
INCREASE INCREASE CHECKPOINT DECREASE DEEP ***** INCREASE
INCREASE FLOAT MEMORY ***** DEEP ***** DECREASE *****
```
输出:
```
0 --> 0
1 --> 1
2 --> 3
*3 --> 3
4 --> 4
0 --> 0
1 --> 1
2 --> 2
*3 --> 5
4 --> 4
0 --> 0
1 --> 1
2 --> 1
*3 --> 7
4 --> 4
0 --> 0
1 --> 1
2 --> 0
*3 --> 9
4 --> 4
0 --> 0
1 --> 1
*2 --> 0
3 --> 11
4 --> 4
0 --> 0
1 --> 1
2 --> 0
*3 --> 11
4 --> 4
0 --> 0
1 --> 1
2 --> 0
*3 --> 10
4 --> 4
```
**示例 3(难):**
输入:
```
1 0 82 11
0
INCREASE INCREASE INCREASE INCREASE INCREASE INCREASE INCREASE
INCREASE INCREASE CHECKPOINT DECREASE DEEP INCREASE INCREASE
INCREASE INCREASE INCREASE INCREASE INCREASE INCREASE DEEP
DEEP DEEP INCREASE INCREASE INCREASE INCREASE INCREASE
FLOAT FLOAT FLOAT FLOAT MEMORY DEEP CHECKPOINT
DECREASE DEEP INCREASE DEEP INCREASE FLOAT FLOAT
MEMORY DEEP DECREASE ***** DEEP DECREASE DECREASE
DECREASE ***** ***** FLOAT INCREASE INCREASE INCREASE
INCREASE ***** DEEP DEEP ***** FLOAT FLOAT
INCREASE INCREASE INCREASE INCREASE ***** DEEP DEEP
***** FLOAT DECREASE DECREASE ***** FLOAT *****
DEEP INCREASE ***** INCREASE *****
```
输出:
```
0 --> 0
1 --> 0
*2 --> 71
3 --> 72
4 --> 45
0 --> 0
1 --> 0
2 --> 71
*3 --> 69
4 --> 45
0 --> 0
1 --> 0
2 --> 71
*3 --> 69
4 --> 45
0 --> 0
1 --> 0
*2 --> 75
3 --> 69
4 --> 45
0 --> 0
1 --> 0
2 --> 75
3 --> 69
*4 --> 45
0 --> 0
1 --> 0
*2 --> 79
3 --> 69
4 --> 45
0 --> 0
1 --> 0
2 --> 79
3 --> 69
*4 --> 45
0 --> 0
1 --> 0
2 --> 79
*3 --> 67
4 --> 45
0 --> 0
1 --> 0
*2 --> 79
3 --> 67
4 --> 45
0 --> 0
1 --> 0
2 --> 79
*3 --> 68
4 --> 45
0 --> 0
1 --> 0
2 --> 79
*3 --> 69
4 --> 45
```
注意:即使 $S$ 的值不是实际自我评估次数,你也不需要打印超过 100 次。
由于思维旅行训练不充分,此人不会深入超过 10000 个位置,也不能嵌套超过 100 层的 CHECKPOINT。
感谢 [Mitch Schwartz](../../../users/cyclops) 提供了这个想法。
**本翻译由 AI 自动生成**
输入格式
无
输出格式
无