这道题据我所知有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时遇到的一种颜色(标记),则这种标记在一个区间内可以对答案产生贡献。扫描线+线段树维护。