不知道是算好牛还是好不牛的题
题目链接。
题意
现在有一棵
两个人轮流进行操作,Alice 先手。每一个人操作的时候需要走向当前点的一个邻居,并且这个邻居之前没有被两个人访问过,不能走的人输。
给定两个点
题解
先来考虑如何对于一个固定点
首先将
然后考虑这个游戏的过程,首先肯定是两个人都在这些关键点上,朝对面的方向走。
直到有一个人某步走在了一个非关键点上,之后两个人会往尽可能远的地方走,第一个走不了的人输。
特别的,如果两个人直到最后都没有走到非关键点上,则可以通过
设
假设当前 Alice 在点
此时若 Alice 下一步要往非关键点上走,那么 Alice 还最多能走
后面 Bob 会挑选尽可能远的地方走,那么 Bob 最多还能走
由于下一步是 Alice 走,所以当
换句话说,若
Bob 的策略同理。
考虑模拟这个过程,中间求区间最值的操作可以使用两个 st 表完成。
那么就可以在
其实求区间最值的过程可以看成每一次删一个数字,然后求最大值,可以直接拿一个桶存起来,然后每一次从上一次查询的答案往下扫,这样就可以做到
F1 的代码,复杂度是
然后来考虑 F2 怎么做。
考虑求出
假设当前想要求
考虑这么一个事情,根据上面的讨论,两个人一定是能往非关键点上走就一定往非关键点上走,也就是说,如果我们能求出,两个人最早能在哪个位置往非关键点上走,问题就解决了。
设
那么问题在于如何求出
考虑枚举一个点
假设当前有两个点
如果 Bob 的起点是
为什么呢?根据上面的讨论,起点为
而起点为
而因为
而这个
所以可以直接枚举每一个
每一个点
然后是有一些细节:
- 注意到如果 Alice 在第一步就往出走,上面的
的式子是错的,还有 Bob 往 那个方向走的贡献,所以需要特判 的情况。 - 和第一条一样,Bob 也可能第一步就直接往右边走,所以
的情况也需要特判。 不存在就设为 , 不存在设为 ,两个人都走不出去的时候看链长度的奇偶性。
代码
代码在 这里,太长了贴出来好丑。
我也是没想到一个博弈题怎么代码这么长。