分散层叠

P6466 【模板】分散层叠算法(Fractional Cascading)

  • 给出 \(k\) 个长度和为 \(N\) 的序列,\(q\) 次询问:
    • 给出 \(x\),问他在这 \(k\) 个序列中的非严格后继。

建立线段树,叶子就是原序列。
对于某个节点,我们分别在其左右儿子的序列中每隔 \(p\) 个数就取一个数,得到两个序列 \(L,R\),然后归并得到这个节点的序列。
查询的时候,假设我们知道了当前这个节点内 \(x\) 的后继,需要知道 \(x\) 分别在左右子树内的后继。
提前预处理节点内序列每个数的不同子树后继,然后发现只用检查当前找到的后继前 \(p\) 个数是否是合法的。
\(p=2\),这样复杂度是 \(O(N)-O(k+\log N)\),空间 \(O(N)\)


  • 给出序列 \(a\),多次询问:
    • 给出 \(l,r,k\),问区间内比 \(k\) 小的数有多少个。

考虑类似上面,但是我们稀疏取样后得到的序列要和当前节点的序列归并,这样空间复杂度 \(O(n\log n)\),查询复杂度 \(O(\log n)\)

posted @ 2026-05-06 10:38  TallBanana  阅读(11)  评论(0)    收藏  举报