题解:P13789 「CZOI-R6」游戏

· · 题解

P13789 「CZOI-R6」游戏 题解

修改日志:2025.10.31:在给Levi_Ack讲题的时候,Levi_Ack问我为什么不能用另一种解法,我一想觉得没问题,新解法不仅好理解还好打,于是我似乎拿了个最短解?

那我们就能想到将 q 个基准点放进一个图里面,同时算最大值。

由于当前点的最大值一定是由其周围的点推过来的,所以我们可以通过递推实现求最大值。

但这个时候又产生了许多棘手的问题,例如怎么知道当前点的最大值是由哪个基准点推过来的?周围点的最大基准点或许并不是当前点的最大基准点等等问题。

在设立一个方向后,只需要用 BFS 跑一遍求最大值即可。

那么我们对于方向为左上,左下,右上,右下的情况分别跑 BFS 后,一个点的最大值就是四种情况中该点值的最大值了。

::::info[以第二个样例为例] 初始表格: 1 -\infty -\infty -\infty
-\infty 3 -\infty -\infty
-\infty -\infty -\infty -\infty
-\infty -\infty 7 -\infty
-\infty -\infty -\infty -\infty
右上方: 1 3 5 7
-\infty 3 5 7
-\infty -\infty 4 6
-\infty -\infty 7 9
-\infty -\infty -\infty -\infty
右下方: 1 3 5 7
-2 3 5 7
-5 0 2 4
-8 -3 7 9
-11 -6 4 6
左上方: 2 0 -2 -\infty
5 3 1 -\infty
8 6 4 -\infty
11 9 7 -\infty
-\infty -\infty -\infty -\infty
左下方: 1 -\infty -\infty -\infty
5 3 -\infty -\infty
2 0 -\infty -\infty
11 9 7 -\infty
8 6 4 -\infty

::::

在第一种解法的基础上,我们会发现斜向维护不仅难理解还难打,于是我们可以先左右递推,再上下递推,此时只需要分别维护一下最大值即可

::::info[以第二个样例为例] 初始表格: 1 -\infty -\infty -\infty
-\infty 3 -\infty -\infty
-\infty -\infty -\infty -\infty
-\infty -\infty 7 -\infty
-\infty -\infty -\infty -\infty
右方: 1 3 5 7
-\infty 3 5 7
-\infty -\infty -\infty -\infty
-\infty -\infty 7 9
-\infty -\infty -\infty -\infty
左方: 1 -\infty -\infty -\infty
5 3 -\infty -\infty
-\infty -\infty -\infty -\infty
11 9 7 -\infty
-\infty -\infty -\infty -\infty
这个时候的表格变为: 1 3 5 7
5 3 5 7
-\infty -\infty -\infty -\infty
11 9 7 9
-\infty -\infty -\infty -\infty
上方: 5 3 5 7
7 5 5 7
9 7 5 7
11 9 7 9
-\infty -\infty -\infty -\infty
下方: 1 3 5 7
5 3 5 7
3 1 3 5
11 9 7 9
9 7 5 7

::::

::::info[后记(如果你不知道为什么错了,请看这里)]

由于基准点的位置可能相同,所以需要在输入基准点的时候维护最大值。

由于代码实现中会出现负数,所以 unsigned long long 最好只给需要取模的值用。

由于点的最大值最小能取到很小,所以设的初始值最好为 -0x7f7f7f7f7f7f7f7f

记得使用 BFS,因为 DFS 在部分情况下会出错。

对于不同的方向跑 BFS 时,记得初始化数组。

::::