分散层叠
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)\)。
浙公网安备 33010602011771号