Mean:
给你一个有根树和一个节点集合S,初始S为空,有q个操作,每个操作要么从树中选一个结点加入到S中(不删除树中节点),要么从S集合中删除一个结点。你需要从树中选一些边组成集合E,E中的边能够是S中的节点连通。对于每一个操作,输出操作后E中所有边的边权之和。
analyse:
首先是构图,把树看作一个无向图,使用邻接表存图。
处理出从1号结点的dfs序存储起来。
添加点u操作:查找S集合中的点与添加的点dfs序在前面且编号最大的点,以及dfs序在后面且编号最小的点,设这两个点是x,y。
那么增加的花费是:dis[u]-dis[lca[(x,u)] - dis [lca(y,u)] + dis[lca(x,y) ]; 其中dis代表该点到根节点的距离。
对于删除点u操作:先把点从集合中删除,然后再计算减少花费,计算公式和增加的计算方法一样。
也是看了题解才撸出来的。
Time complexity: O(N)
Source code: