CF1529E

这篇博客讨论了如何利用深度优先搜索(DFS)序来处理树上的特定问题。作者证明了一个关键性质:一个团一定位于树的一条链上,并阐述了节点DFS序区间的关系。在解决实际问题时,采用贪心策略,每次尝试添加节点,如果导致冲突则保留非祖先节点。解决方案包括记录每个节点的DFS序区间,然后在DFS遍历过程中动态维护最优解。整个过程保证了答案的单调性和最优子结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

两棵树分别记为 S,K

lemma:

  1. 一个团一定位于S的一条链上

    proof:显然

  2. 考虑K树dfs序,任何节点的dfs序区间之间只有包含或不相交的关系(本身的dfs序和子树中最大的dfs序组成的区间)

    proof:显然

  3. 考虑K树dfs序,则x是y的祖先的充分必要条件是x子树的dfs序区间包含y子树的dfs序区间

    proof:显然

  4. 在加入新点时如果可行贪心选择,如果不可行保留不是祖先的点,删除另一个点。

    按此方法有最优子结构且答案单调不递减(对于新点每次至多只有一个是它的祖先,或它的儿子)

    proof:由lemma2,3,可以得到贪心选择不是祖先的点一定要优于选择是祖先的点。按此方法,如果某刻加入一个点后有三个点矛盾了,那么在加入三个点中的第二个点时就会删掉前两个矛盾的点中的一个,即每次处理完后所有点互相都不矛盾(所有点的dfs序区间不相交)。

Solution:

​ 首先记录K树每个节点dfs序区间

​ 然后dfs遍历S树,dfs遍历过的点始终是一条链(遍历到叶子会回溯),此时lemma1满足。

​ 考虑现在遍历到点y,按照lemma4考虑是否加入点y

​ 每次记录最大值

​ 到叶子节点回溯

​ 具体实现可以考虑支持区间修改单点查询的数据结构,记录当前被选择的区间的节点编号,查询该点是否被选择,如果被选择的话编号是多少,需要保留谁,然后就是 区间修改了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值