jzoj5027

这道题据我所知有4种方法。

1.莫队。一组询问答案显然是排序相邻的点的lca的深度最小值。

这种问题在插入时是O(logn)的,因为要快速维护相邻的点(前驱/后继)

在删除时是O(1)的,直接在链表上删除即可。链表上的前驱/后继也是当前点的前驱/后继。

可以使用回滚莫队消除一个log。

2.bitset。暂时不会。

3.启发式合并。在每个lca处统计贡献。

每个节点维护它的子树内的后缀代表节点。

在合并时要处理O(n^2)个询问的答案。且还要扫描线多一个log。

但是实际上对于每个节点,只有前驱和后继是有用的。所以只需要处理O(n)个询问的答案。

4.lct。一个暴力的做法是对于每个节点跳到根,统计它到根节点的点的贡献。然后更新它到根节点的标记。

每个节点记一个标记,表示它被更新过的最晚节点。显然处理这个点时直接把上面的标记更新为当前节点即可。

这个过程就是lct的access过程,使用lct维护(sdoi树点涂色)

对于一个节点在跳lca时遇到的一种颜色(标记),则这种标记在一个区间内可以对答案产生贡献。扫描线+线段树维护。

原文地址:https://www.cnblogs.com/cszmc2004/p/12938389.html