#L3527. 「IOI2021」地牢游戏
「IOI2021」地牢游戏
题目描述
注意:请在提交源代码前添加 #include "dungeons.h"。
Robert 正在设计一款新的电脑游戏。游戏中有一位英雄、 个敌人和 个地牢。敌人从 到 编号,地牢从 到 编号。敌人 ()处在地牢 ,其能力值为 。地牢 里没有敌人。
英雄一开始进入地牢 ,初始能力值为 。每次英雄进入地牢 ()时,都需要面对敌人 ,且会发生以下情况中的一种:
-
如果英雄的能力值大于等于敌人 的能力值 ,那么英雄会胜出。这使得英雄的能力值增加 ()。这种情况下,下一步英雄将会进入地牢 ()。
-
否则英雄会战败,这使得英雄的能力值增加 ()。在这种情况下,下一步英雄将会进入地牢 。
注意 可能会小于、等于、大于 , 可能会小于、等于、大于 。无论对战结果如何,敌人 始终处在地牢 ,且能力值为 。
当英雄进入地牢 的时候,游戏结束。可以看出无论英雄的起始地牢和初始能力值如何,游戏一定会在有限次对战之后结束。
Robert 希望你通过 次模拟来对游戏进行测试。对于每次模拟,Robert 输入英雄的起始地牢 和初始能力值 。你需要做的是对于每次模拟给出游戏结束时英雄的能力值。
实现细节
你要实现以下函数:
void init(int n, int[] s, int[] p, int[] w, int[] l)
- :敌人的数量。
- , , , :长度为 的序列。对于每一个 ():
- 是敌人 的能力值,也是击败敌人 后英雄增加的能力值。
- 是英雄被敌人 击败后增加的能力值。
- 是英雄击败敌人 后进入的下一个地牢的编号。
- 是英雄被敌人 击败后进入的下一个地牢的编号。
- 恰好调用此函数一次,且发生在任何对如下的
simulate函数的调用之前。
int64 simulate(int x, int z)
- :英雄的起始地牢编号。
- :英雄的初始能力值。
- 假设英雄的起始地牢编号为 ,初始能力值为 ,函数的返回值是相应情况下游戏结束时英雄的能力值。
- 恰好调用此函数 次。
评测程序示例
评测程序示例以如下格式读取输入数据:
- 第 行:
- 第 行:
- 第 行:
- 第 行:
- 第 行:
- 第 行():,是第 次调用
simulate的参数。
评测程序示例以如下格式打印你的答案:
- 第 行():第 次调用
simulate的返回值。
样例
输入
3 2
2 6 9
3 1 2
2 2 3
1 0 1
0 1
2 3
输出
24
25
解释
考虑以下调用:
init(3, [2, 6, 9], [3, 1, 2], [2, 2, 3], [1, 0, 1])
上图对应这次的 init 调用。每一个正方形都代表了一个地牢。对于所有存在敌人的地牢,、 对应的值都已经在正方形内表示出来了。红色箭头展示了英雄战胜敌人后游戏状态的变化,黑色箭头展示了英雄战败后游戏状态的变化。
这时如果调用 simulate(0, 1),游戏会以如下方式进行:
| 地牢编号 | 英雄在战斗前的能力值 | 胜负结果 |
|---|---|---|
| 0 | 1 | 战败 |
| 1 | 4 | |
| 0 | 5 | 胜出 |
| 2 | 7 | 战败 |
| 1 | 9 | 胜出 |
| 2 | 15 | |
| 3 | 24 | 游戏结束 |
因此,simulate(0, 1) 的返回值应该是 。
这时如果调用 simulate(2, 3),游戏会以如下方式进行:
| 地牢编号 | 英雄在战斗前的能力值 | 胜负结果 |
|---|---|---|
| 2 | 3 | 战败 |
| 1 | 5 | |
| 0 | 6 | 胜出 |
| 2 | 8 | 战败 |
| 1 | 10 | 胜出 |
| 2 | 16 | |
| 3 | 25 | 游戏结束 |
因此,simulate(2, 3) 的返回值应该是 。
数据范围与提示
对于所有数据:
- (对于所有的 )
- (对于所有的 )
- (对于所有的 )
子任务
| 子任务 | 分值 | 特殊限制 |
|---|---|---|
| 1 | 11 | ,,(对于所有的 ) |
| 2 | 26 | (对于所有的 ) |
| 3 | 13 | ,所有的敌人拥有相同的能力值,即 ,对于所有的 |
| 4 | 12 | ,所有的 至多有 种不同的数值 |
| 5 | 27 | |
| 6 | 11 | 没有额外的约束条件 |