CF1529E
Posted ullio
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF1529E相关的知识,希望对你有一定的参考价值。
两棵树分别记为 S,K
lemma:
-
一个团一定位于S的一条链上
proof:显然
-
考虑K树dfs序,任何节点的dfs序区间之间只有包含或不相交的关系(本身的dfs序和子树中最大的dfs序组成的区间)
proof:显然
-
考虑K树dfs序,则x是y的祖先的充分必要条件是x子树的dfs序区间包含y子树的dfs序区间
proof:显然
-
在加入新点时如果可行贪心选择,如果不可行保留不是祖先的点,删除另一个点。
按此方法有最优子结构且答案单调不递减(对于新点每次至多只有一个是它的祖先,或它的儿子)
proof:由lemma2,3,可以得到贪心选择不是祖先的点一定要优于选择是祖先的点。按此方法,如果某刻加入一个点后有三个点矛盾了,那么在加入三个点中的第二个点时就会删掉前两个矛盾的点中的一个,即每次处理完后所有点互相都不矛盾(所有点的dfs序区间不相交)。
Solution:
首先记录K树每个节点dfs序区间
然后dfs遍历S树,dfs遍历过的点始终是一条链(遍历到叶子会回溯),此时lemma1满足。
考虑现在遍历到点y,按照lemma4考虑是否加入点y
每次记录最大值
到叶子节点回溯
具体实现可以考虑支持区间修改单点查询的数据结构,记录当前被选择的区间的节点编号,查询该点是否被选择,如果被选择的话编号是多少,需要保留谁,然后就是 区间修改了。
以上是关于CF1529E的主要内容,如果未能解决你的问题,请参考以下文章