分散层叠算法(Fractional Cascading)
违规用户名1425622 · · 题解
考虑经典问题:
给出
k 个长度为n 的有序数组。现在有
q 个查询 : 给出数x ,分别求出每个数组中大于等于x 的最小的数(非严格后继)。强制在线。
首先,我们有经典二分算法,可以在
考虑一开始将所有数排序,容易用多路归并算法做到
那么我们在查询时可以先二分一次,这样我们我们就将问题转化成了要查询某个位置之后每个颜色的最前的出现位置,容易做到
因此总复杂度可以做到
你发现这个还是很唐,我们考虑详细看一下归并过程。
我们考虑从下向上归并,每次选出当前偶数位的数与上一层进行归并,在归并时记下自己在当前这一层的后继是谁,在下面的归并序列的位置。
那么我们考虑查询,容易发现上一层到下一层的位置与后继之间的差不会超过 1。
考虑前面处理的复杂度,每一层向上走时长度都会除 2,那么归并复杂度是
那么总复杂度为
注意到我们显然可以调整每一层的序列的长度,设选其中
但其实,对此的问题我们有更平凡的做法。
考虑原来的归并做法,注意到不可行的原因在于我们要处理出所有颜色的答案,但这是不必要的,我们可以设
那么我们二分到一个位置
那么总复杂度为
这个显然也可以模仿分散层叠进行均摊,只需让
当然的,可以用基数排序消掉预处理的 log。