CF1452G - Game on Tree
CF1452G - Game On Tree
题目大意
A和B在树上Van游戏,每个人操作一些点
A操作一个点$i$,B操作一个点集$a_j$
每轮A,B分别进行操作,可以对于自己的所有点任意移动1步或0步
在某一轮,当A的点碰到B的点时游戏结束
A希望尽量迟结束,B希望尽量早结束
给定B的初始点集$a_j$,对于A的每个初始点$i$判断多少轮结束
分析
由于B的操作显然是不停向A收缩直到碰到
那么可以广搜求出每个点原地不动时被B干掉的时间$F_i$
那么考虑A的移动过程,每一步可以到达一个点$u$
必须满足在第$i$步所在的点$u$,$F_u>i$,否则结束游戏
对于初始节点$u$,不妨设最终结束的节点为$t$,我们希望一路跑到$t$然后站住不动,此时答案就是$F_t$
而实际上,任何一个点$u$能够跑到$t$,等价于$dis(u,t)<F_t$
Proof:
由最短路三角不等式可知
$\forall (u,v)\in Tree, dis_{v}-1\leq dis_u\leq dis_{v}+1$
即$dis_e$在树的路径上连续变化,不妨设移动路径为$p_i,i\in[1,k],p_k=t,k\leq F_t$
若能在$F_t-1$的时间内到达$p_k$,那么必然能在$F_t-2$的时间内到达$p_{k-1}$
进而归纳得到
那么问题变成了,对于每个点$u$,向周围$F_u-1$范围内的点对于$F_u$取$\max$
容易点分治处理,复杂度为$O(n\log n)$
1 | const int N=2e5+10,INF=1e9+10; |