P5838 「USACO19DEC」Milk Visits G

维护从当前结点向上走遇到每种颜色的第一个结点,进入子树时更新当前结点颜色,最后离开时撤销更新。

离线可以把询问挂在结点上,判断两个端点向上走遇到询问颜色的第一个结点是否相同,不相同说明路径上存在询问颜色的结点。

但这样无法处理只有 LCA 为询问颜色的情况,所以把维护内容改成遇到每种颜色的第一个结点的对应儿子就可以了。

时间复杂度 \(O(N)\)


考虑在线做法,本质问题在于端点颜色并不一定等于询问颜色,全部记录下来不可取。

所以只能寻找可替代端点且颜色等于询问颜色的结点。容易发现 DFS 序在端点后面且最小的结点可以替代,因为其一定是在经过端点后第一次遇到的。

DFS 序在端点前面的结点按倒序遍历边的 DFS 序做即可。注意本身在路径上的结点无论怎么遍历 DFS 序都是在前面的,要特判一次 DFS 序在端点前面且最大的结点。

由于我们是在线的,没有办法像离线一样根据当前遍历情况判断 LCA 了,只能被迫求 LCA 处理。但找结点本就要二分所以用树剖的话不改变瓶颈。

时间复杂度 \(O(M\log N)\)

posted @ 2025-05-25 01:47  Sumering  阅读(36)  评论(0)    收藏  举报