Luogu4183 [USACO18JAN] Cow at Large P
题意:有一棵
现在有一个人闯入了迷宫深处,他达到出口就可以逃离。
可以在出入口放置守卫,守卫的移动速度和闯入者相同,若闯入者和守卫相遇则被抓住。
守卫和闯入者在移动过程中均可以观察到对方的位置,而后决策。
对于闯入者可能的每个起点,问至少需要多少个守卫才能确保闯入者无法逃脱?
先来观察一下性质。为了方便,不妨将起点置为根。
守卫的目标相当于封锁所有的叶节点,如果这一目的达到,接下来就是瓮中捉鳖。
如果闯入者来到了某个没有守卫的子树,就可以一路向下到达叶节点。由于移动速度相同,守卫是追不上他的。
对于某个点,若某个叶节点
到达该子树的距离,不超过根到该点的距离,则称为可以封锁。(在 放一个守卫,即可赶在逃脱者到来之前到达该点) 若某个点可以封锁,则该点的子树也可以封锁。
设可以封锁的点集为
在所有可封锁的点中,去掉有祖孙关系的点,留下尽量浅的点,它们(称为“表面点”)的个数即为答案。
若对每个起点做一次贪心,复杂度是
考虑使用点分树,每个点出发到达的联通块会被剖分成
对于点分树上的某个分治块,可以视为有根子问题,求出深度
某个从
“表面点”可以转化为:若父亲合法,则儿子不贡献。
由于若父亲能贡献,儿子必然贡献,我们可以在父亲处扣除儿子的贡献。
设
(
对前面的条件移项变为
可以证明
对于某个子树不贡献的要求,可以容斥掉。
具体实现中,由于不需要在线回答,可以直接点分治。