对于一类有插入、删除(撤销插入)和整体查询操作的题目,可以考虑用线段树分治解决,也叫时间分治。
线段树分治是一种离线做法,处理的是某种修改对询问的影响,这种影响可以独立也可以不独立。
关键是把一个修改看成一个区间,每个询问是一个叶子。修改是在线段树上打标记。这里把询问看做一个时间点,而修改对应一个时间区间的修改。
做法:在线段树上记录要操作的时间区间,dfs依次执行这一操作,一直到根节点来回答询问,离开时将其撤销。
题目: 有两种操作,一种是将两个点连一条边,另一种就是询问这个点所在的连通块的点数,但是这个边的有效时间只有k天。每次操作过一天。
分析: 如果没有有效时间的话,就是并查集的裸题。那么一次1操作本质上影响的是[i,i+k-1]这一时间段的答案。所以我们采用线段树分治,将每个操作都放到线段树的节点上,那么这个操作最多放在logn个节点上。最后我们对这棵线段树进行dfs,每次进入这个点就执行对应节点上的合并操作,一直到根节点回答询问,离开时撤销即可。所以还需要可撤销并查集。
线段树分治
最新推荐文章于 2023-08-09 10:26:05 发布