$N$ 名魔法师聚集在一起,计划举行一场联谊会,分享彼此的魔法。在这个联谊会上,他们会进行一整天的趣味游戏。
游戏在一个巨大的会议室中进行。会议室里有一张圆桌,圆桌上有 $N$ 个座位。圆桌的每个座位看起来都完全相同,魔法师们也长得一模一样,无法相互区分。在游戏进行过程中,魔法师们不能说任何话。
游戏分为三个阶段,每个阶段如下:
- 早晨:魔法师们围坐在圆桌旁。每个座位上放着一张空白纸和一张写有 $0$ 以上 $N-1$ 以下整数的纸。每张纸上写的整数各不相同。魔法师们可以看到自己和坐在自己右侧的人的纸上写的整数。基于此,魔法师们在空白纸上写下一个 $0$ 以上 $10^9$ 以下的整数。这个整数由魔法师小心地写下,只有自己能看到。之后,将刚才写下整数的纸折叠放在座位上,拿着最初放在座位上的写有整数的纸离开会议室。
- 中午:魔法师们围坐在圆桌旁。每个座位上放着一张空白纸和一张早晨自己写过数字的纸。魔法师们可以看到自己以及坐在自己左侧和右侧的人的纸上写的整数。基于此,魔法师们在空白纸上写下一个 $0$ 以上 $10^9$ 以下的整数。这个整数由魔法师小心地写下,只有自己能看到。之后,将刚才写下整数的纸折叠放在座位上,拿着早晨写过数字的纸离开会议室。
- 晚上:魔法师们围坐在圆桌旁。每个座位上放着一张空白纸和一张中午自己写过数字的纸。魔法师们可以看到自己以及坐在自己左侧和右侧的人的纸上写的整数。基于此,魔法师们在空白纸上写下一个 $0$ 以上 $40$ 以下的整数。这个整数由魔法师小心地写下,只有自己能看到。之后,将刚才写下整数的纸折叠放在座位上,拿着中午写过数字的纸离开会议室。
离开会议室后,手中的纸会因魔法力量而消失,并忘记在会议室中进行的所有行为。早晨、中午、晚上每位魔法师坐的位置相同。
魔法师们不知道 $N$,但他们知道 $10 \le N \le 100\,000$。
游戏结束后,联谊会运营方将放在座位上的纸全部展开。为了让魔法师们赢得游戏,圆桌上相邻座位上的纸上写的数字必须互不相同。此外,游戏结束时(即晚上结束后),纸上写的数字越小越好。
魔法师们在游戏进行中不能说话,但在游戏开始前可以商定使用共同的策略。你需要代替魔法师们构思最终在纸上写下尽可能小的数字的策略。
实现细节
你需要实现以下函数:
void init()
- 该函数仅被调用一次,且在所有其他函数被调用之前调用。
- 如果后续函数调用需要预处理或全局变量设置,可以在此函数中实现。
int morning(int my_num, int right_num)
my_num:早晨魔法师座位上的纸上写的整数。right_num:早晨魔法师右侧座位上的纸上写的整数。- 该函数应返回魔法师早晨在空白纸上要写的整数。该函数的返回值必须在 $0$ 以上 $10^9$ 以下。
- 该函数的返回值必须仅依赖于
my_num和right_num的值。 - 该函数最多被调用 $2\,000\,000$ 次。
int afternoon(int left_num, int my_num, int right_num)
left_num:中午魔法师左侧座位上的纸上写的整数。my_num:中午魔法师座位上的纸上写的整数。right_num:中午魔法师右侧座位上的纸上写的整数。- 该函数应返回魔法师中午在空白纸上要写的整数。该函数的返回值必须在 $0$ 以上 $10^9$ 以下。
- 该函数的返回值必须仅依赖于
left_num、my_num和right_num的值。 - 该函数最多被调用 $2\,000\,000$ 次。
int evening(int left_num, int my_num, int right_num)
left_num:晚上魔法师左侧座位上的纸上写的整数。my_num:晚上魔法师座位上的纸上写的整数。right_num:晚上魔法师右侧座位上的纸上写的整数。- 该函数应返回魔法师晚上在空白纸上要写的整数。该函数的返回值必须在 $0$ 以上 $40$ 以下。
- 该函数的返回值必须仅依赖于
left_num、my_num和right_num的值。 - 该函数最多被调用 $2\,000\,000$ 次。
提交的源代码中任何部分都不得执行输入输出函数。
morning、afternoon、evening 函数的返回值必须仅依赖于给定参数的值。如果多次以相同的参数值调用函数时返回不同的值,无论游戏胜负如何,都将被视为错误答案。
每个测试用例由多个(一个或多个)独立的博弈组成。虽然不保证 morning、afternoon、evening 函数按顺序调用,但保证游戏是基于函数返回值按照题目描述的方式进行的。
在每个测试用例中,你的程序会被运行两次。在比赛系统中,执行时间测量为两次运行程序执行时间的总和,内存使用量也测量为两次运行程序内存使用量的总和。时间限制和内存限制以两次运行结果的总和为准。morning、afternoon、evening 函数的调用次数限制也以两次运行中的调用次数总和为准。
实际提交时,可以假设最坏情况下评测程序基本消耗的时间在 2 秒以内。
数据范围
- $10 \le N \le 100\,000$
- 每个测试用例中
morning函数最多被调用 $2\,000\,000$ 次。 - 每个测试用例中
afternoon函数最多被调用 $2\,000\,000$ 次。 - 每个测试用例中
evening函数最多被调用 $2\,000\,000$ 次。
子任务
- (5分) $N \le 40$
- (95分) 无额外限制
如果在任何测试用例中,基于 morning、afternoon、evening 函数的返回值进行游戏时魔法师们未能获胜,则该子任务得 0 分。
子任务 2 有部分分。对于该子任务,设 evening 函数返回值中的最大值加 1 为 $m$。在该子任务中,你的得分如下表所示:
| 条件 | 得分 |
|---|---|
| $10 \le m \le 40$ | $46 - m$ |
| $m = 9$ | $38$ |
| $m = 8$ | $41$ |
| $m = 7$ | $46$ |
| $m = 6$ | $52$ |
| $m = 5$ | $64$ |
| $m = 4$ | $76$ |
| $m \le 3$ | $95$ |