CF1452G Game On Tree

可以理解为狮群抓羊。对每个点都要输出答案,有点天天爱跑步那味道。

给定一个步数X,怎么判断在双方都走最优走法的情况下,X步后羊是否被抓呢?

狮子只有一只,问题可能会简化很多。

这感觉也是个经典问题,但我不会。

 

题解中把羊的走法的形态给分析出来了,一定是一直跑,然后停在一点不动。

假设在第x步羊跑到了点a,同时这一步内狮子也跑到了点a,那么其实,完全可以在第x-1步的时候羊不动,因为在算法终结前,没有狮子在第x-1步羊的位置(否则也就不会有第x步了),所以狮子也至少需要1步来走到羊的位置。因此我们的方案都可以调整为,一直跑,然后停在一点不动,且在羊刚跑到终点的那一步内,狮子并没有追上。

那么这个终点就具有一种性质,它到狮子的距离的最小值一定>它到羊的起点的距离。

 

但这个证明不是第一眼看上去那么显然,因为羊的走法不是事先规划好的,而是动态调整的。

不管羊怎么跑,每只狮子都朝它与羊的最短路缩短的方向上走,这样是最好的抓捕策略吗?就某只狮子与羊来看,的确如此(这一步直觉感受一下)。那么对于整体来说,最优之中取最优,也是最优。

在羊的所有走法中,对于那些以a为终点的方案,首先,按照我们的走法,每只狮子与羊的距离只会减少、不变,但绝不会增加。

现在反证,假设,终点,它到狮子的距离的最小值<=它到羊的起点的距离。

如果初始情况下狮子与羊的最短路中包含a,则狮子一定比羊更先达到a(不管羊往什么方向跑,只要狮子按照我们的策略跑,一定能达到a且比羊更早达到)

而狮子一旦达到a,这时我们按照a把树分裂,除了a所在的树外,其余树上的点,a在之后的逃亡中绝不会达到。(狮子始终守住了关口,这一步直觉感受一下)

因此a不可能是羊在经过我们调整意义下(最后不是羊和狮子同时到a)的方案的终点。

于是初始情况下狮子与羊的最短路中不包含a,但是a在最短路上的祖先,必然离狮子更近,于是再次直观感受一下,羊也不可能突破狮子的关口。

因此,包含a或不包含a都不可能,矛盾,终点它到狮子的距离的最小值一定>它到羊的起点的距离。

 

这是个必要条件,反过来,如果终点满足这个条件,那么羊可以一路沿着最短路走到终点(没有别的狮子可以在这个路径上拦截,这会破坏必要条件),因此这个必要条件所限定的点同时也是终点的充分条件。

我们利用终点来分类讨论,           其实           ,好像也没有讨论的必要啊,反正是终点,且中途不会被拦截,那么对应的答案就是狮子到这个点的距离的最小值,对每个点,这些最小值算出来max就是ans了。

不过我们是要对每个点输出答案。

暴力算O(N^2),优化的话,怎么感觉又是一个经典(但不会)的问题。把狮群的点设成d=0加入到队列,然后bfs就行了。O(N)

 

posted @ 2021-03-08 12:59  AngelKnows  阅读(89)  评论(0)    收藏  举报