一道很无脑的题,但考试没写出来
爆搜
首先看朴素算法
1.从根节点开始遍历每个节点
2.遇到要保存的节点就进行标记,直到所有保存节点都标记
时间复杂度 \(O(n)\)
其实已经能过了,但我没用(doge)
树链剖分(LCA)
首先分析
1.每一次砍掉枝叶,都是在没有要保存的节点存在子树上时
2.因此,我们可以将每一个要保存的节点进行求最近公共祖先
3.最后对每个节点进行向上遍历,判断是否有要保存的节点在其子树上
4.如果有就保存,没有就删去其子树的数量
考虑最坏情况每个节点都遍历,时间复杂度\(O(n log(n))\)
一般情况下时间复杂度是比爆搜要快的,也快不到哪去
代码
(doge)