题解都说了,当统计为根节点的时候,答案就是满足以下条件的的数量:且,设这个数量为。以下严格证明
首先对于满足这个条件的,其子树的叶子节点显然最多只有一个有农夫(否则就放多了)
我们考虑任意一个叶子节点,有,但是对于又有;于是我们猜想,从到的路径上,会有一个临界点,从到这个临界点的点都有,在这个临界点到都有
证:从出发向走,每一步都会减少一,而要么减少一(当前点到离当前点最远的叶子节点要先走到父亲节点再走到叶子节点,注意中途不会经过当前点)要么增加一(离当前点最远的叶子节点在当前点的子树中,并要满足某种限制条件)要么不变(离当前点最远的叶子节点在当前点的子树中,并且不满足某种限制条件,可以想一下这个限制条件是什么)。所以当第一次后,之后的减少程度一定不会超过的减少程度,也就是说恒有
有了上述性质我们就可以发现,对于任意一个叶子节点,其到根的路径上有且仅有一个点满足最开始给的不等式,所以对于任意一个叶子节点,我们都可以唯一地指定给一个满足最开始不等式的一个点,而满足最开始不等式的点所管辖的叶子节点集合一定不是空集,也就是说满足最开始不等式的点构成了叶子节点集合的一个划分;而且由上述证明过程可知,设是满足最开始不等式的点,则离其最近的叶子节点一定在其所管辖的集合中,也就是其子树中(否则的话,走到其父亲,和都会减一,仍有,与最开始的不等式矛盾)
然后我们就可以知道,我们对于每个满足最开始不等式的点,选出离其最近的叶子节点放置农夫,这样就可以在个农夫中抓住bessie。而如果答案比小,那么由于鸽巢原理,肯定有一个满足最开始不等式的,其叶子节点一个都没有放农夫,于是Bessie就可以往走,在其走到的时候,一定不会有农夫抓住他,然后她任选一个叶子节点就可以逃跑了
接下来考虑统计满足不等式的点的数量
首先先求出数组,可以用换根DP,也可以用类似多起点Dij的BFS
接下来如果暴力,我们就可以枚举根节点,然后进行暴力统计,时间复杂度;关键就在于根节点,想办法消除根的影响,可以知道与根无关,其实也与根无关,,其中表示到的距离;那么现在就是处理不了,接下来的技巧可以记住
设为根节点,就是满足不等式的点的个数,设为满足不等式的点,以为根的子树,由握手定理,其中是的子孙。式子可以改写成
由上面的证明过程,我们可以知道,不同的不可能有祖孙关系,所以(也就是每个满足不等式的的贡献为,将替换为即可)
点分治除了处理静态树上路径,还可以处理静态点对关系,具体来说,就是点分治每次在计算以为根的子树时(是这棵子树的重心),我们考虑一定经过的点对即可,可以知道,每个点对在整个点分治过程中会且仅会被统计一次
那么对于这道题目,由于点对关系是有序的(i.e. 以为根,以为根),所以树上直接统计就不好做了,我们只能指针扫描数组,具体来说,可以先将所有点全部存入树状数组中,然后在计算某一颗子树的时候,先将这棵子树的所有点对树状数组的操作撤销,再进行统计,统计完之后,再将这棵子树的所有点的操作加回来
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构