[CF1528C] Trees of Tranquillity 题解
祖孙关系的限制,比非祖先关系的限制要苛刻一些,我们考虑在第一棵树上 DFS 寻找答案。
在此之前,我们先处理出每个点在第二棵树上的 DFS 序,记作 \(\{dfn\}\)。
我们在第一棵树上 DFS,到结点 \(u\) 的时候判断是否应该选进来。这时,结点的 \(dfn\)【管辖】的区间形成了一定的覆盖关系。而第二棵树上的非祖先关系,等价于一个个【管辖】区间不交。
我们 DFS 到结点 \(u\),判断此时加进【线段】\(u\) 优不优,同时维护已选点集合。我们的贪心满足一个原则:尽量选深度大的。有三种情况:
- 线段 \(u\) 覆盖了其他结点:即第二棵树上,\(u\) 为已选某点的祖先。此时不应选 \(u\)。
- 线段 \(u\) 被其他结点覆盖:由于之前维护的已选点集是合法的,此时最多有一个结点覆盖到 \(u\)。此时选 \(u\) 是较优的(深度较大),然后删掉覆盖到 \(u\) 的祖先。
- 不形成覆盖关系:直接加入 \(u\)。
该过程可用 set 实现。同时注意,在回溯的时候,要撤销当前点做出的修改,以保证对兄弟进行正确的算法。

浙公网安备 33010602011771号