我们可以将莫队算法从一维扩展到更高维度。
考虑正在维护 k 维结构的信息,且每一维的大小分别为 n1,n2,⋯,nk。为了下文叙述方便,我们将维度大小序列复制一份,得到 nk+1,⋯,n2k(ni=ni−k)。我们同时维护 2k 个指针,第 i (i≤k) 个指针维护第 i 维左端点,第 i (k<i≤2k) 个指针维护第 i−k 维右端点。按询问处理顺序依次移动到每个询问对应的位置上。
现在考虑对询问分块、排序。记对于前 2k−1 个指针,分块大小分别为 s1,s2,⋯,s2k−1。记一共有 q 个询问。我们按照第 i (i<2k) 个指针所属小块的编号作为第 i 关键字,第 2k 个指针位置作为第 2k 关键字对询问排序。于是总移动次数为
O(qi=1∑2k−1si)+i=1∑2kO(∏j=1i−1sj∏j=1inj)(块内移动、本维指针因更优先关键字重置)
上式右侧一项中,显然只有 O(∏j=12k−1sj∏j=12knj) 最显著。于是得到总移动次数为
O(q(s1+s2+⋯+s2k−1)+s1s2⋯s2k−1n1n2⋯n2k)
我们小学二年级就学过“(两实数)和定差小积大”。事实上,我们可以用调整法轻松证明这对于任意整数 l (l>1) 都成立:l 个实数 a1,⋯,al 之和为定值 m,则当 a1=a2=⋯=al=lm 时有 ∏i=1lai 最大,是为 llml。
于是考虑 m=∑i=12k−1si。令 N=∏i=12kni。我们自然希望 m 固定时有 ∏i=12k−1si 最大以令 s1s2⋯s2k−1N 最小。所以上式转写为
O(qm+m2k−1N(2k−1)2k−1)
我们设 f(m)=qm+m2k−1N(2k−1)2k−1,则 f′(m)=q−m2kN(2k−1)2k−1。注意到 f′(m) 单增且存在零点,故我们找到其零点并以此计算 si 的取值,就能获得最优理论复杂度。实际上为了简便计算,由于 k 通常较小,我们常忽略一些乘积项;故取
⟹si=2km=2kqNO(kN2k1q2k2k−1+q2k1N2k2k−1)
注意上式是指针移动次数而非最终复杂度。实际应用中,我们还可以适当将块长减小,届时还请就题分析。
1 Response
[…] 高维莫队。如果认为 n,mn,mn,m 同级,复杂度 O(n4q4+nq34)newcommandbigO[1]{operatorname{O}left(#1right)}bigO{n^4sqrt[4]{q}+nq^{frac{3}{4}}}O(n44q […]