浅谈线段树分治

发布时间 2023-03-27 22:04:24作者: Xun_Xiaoyao

有的时候,我们需要维护删除操作,而有很多操作是不支持删除或无法快速删除,我们就考虑将所有的操作离线,在时间轴上建线段树,将一个操作和他的删除看作是对于时间轴的有一段区间的操作。
这样,我们就可以更加方便地维护某些操作的删除了。

二分图

一个 \(n\) 个点的图,有 \(m\) 条边,第 \(i\) 条边连接 \(u_i,v_i\),在 \(l_i\) 时刻出现,在 \(r_i\) 时刻消失。对于每一个时刻,询问这时的图是不是二分图。
考虑使用扩展域并查集维护是否是二分图,但是考虑到不好维护删除操作,所以考虑在时间轴上建线段树,这样一条边将会对应线段树上的 \(O(\log k)\) 个节点,我们对线段树进行一边遍历,在次过程中维护扩展域并查集,记录下每一次合并的操作,并在最后撤回每一次合并操作即可。
由于要支持撤回,只能使用按秩合并。
时间复杂度 \(O(m\log n\log k)\)

[FJOI2015]火星商店问题

\(n\) 个商店,每个商店存在的一个价值为 \(v_i\) 商品,接下来支持两种操作:

  1. \(s\) 个商店上架了一个价值为 \(v\) 的商品。
  2. 询问 \([L,R]\) 中的所有商店中在 \([d_l,d_r]\) 上架的商品以及一直存在的商品中 \(v\oplus x\) 的最大值。

由于处理一直存在的商品是平凡的,所以考虑如何处理新上架的商品。
在时间轴上建线段树,我们的操作就变为了单点插入商品,和区间维护异或最大值。
对于前者,我们在线段树上包含这个时刻的 \(O(\log n)\) 的节点分别加入该商品。
对于后者,我们将其拆分为在线段树上的 \(O(\log n)\) 个区间查询。
在每一个点上建一次可持久化 Trie 树,查询答案即可。
时间复杂度 \(O(n\log^2 n)\)