树套树

树套树

简介

就是一个树的结点里面再搞一棵树,维护结点信息。

树套树要保证其空间复杂度正确,关键应该在于保证每棵内层树的大小与其外层树节点满足小复杂度关系。

树套树要保证其时间复杂度正确,关键应该在于保证每次操作需要访问外层树节点个数可接受以及每次访问内层树的时间复杂度可以接受。

但是我觉得更加困难的是思考应该使用什么数据结构去维护。

线段树套平衡树

一般来讲,线段树维护区间 \([l,r]\) 的答案,那么我们就开一个 \(r-l+1\) 个结点的平衡树来维护这个区间啊。空间复杂度是 \(O(n \log n)\) 的,时间复杂度是 \(O(n \ poly(\log))\) 的。

P3380 【模板】树套树

树套树板子题。

\(5\) 种操作:

  1. 查询 \(val\) 在区间 \([l,r]\) 的排名:对每个相关的线段树结点数一下这个区间里 \(<val\) 的元素数量。单次时间复杂度 \(O(\log ^2 n)\)
  2. 查询区间 \([l,r]\)\(k\) 大的元素是什么:二分答案 \(val\)\(check\) 里面就求 \(val\) 在区间的排名。单次时间复杂度 \(O(\log ^3)\)
  3. 将位置 \(pos\) 的数字改成 \(x\):对每个相关的线段树结点修改其平衡树即可。单次时间复杂度 \(O(\log^2)\)
  4. 查询值 \(val\) 在区间 \([l,r]\) 的前驱:对每个相关的线段树结点求前驱,然后取最大值。单次时间复杂度 \(O(\log^2)\)
  5. 查询值 \(val\) 在区间 \([l,r]\) 的后继:对每个相关的线段树结点求后继,然后取最小值。单次时间复杂度 \(O(\log^2)\)

code

P3316 [SDOI2014] 里面还是外面 黑色的毒瘤数据结构题。

posted @ 2024-12-30 21:59  liyixin  阅读(5)  评论(0编辑  收藏  举报