手动博客搬家: 本文发表于20180919 15:41:25, 原地址https://blog.csdn.net/suncongbo/article/details/82771387

背景介绍

首先,我是一名菜鸡。
前几天在做bzoj 5283时,经过转化后需要处理这样一个二元函数
\(S(x,y)=\sum^{x}_{i=1} C^i_y\)
其中有\(Q\)组询问,\(x\le y\le 2.5\times 10^5, Q\le 2.5\times 10^5\).
做法是:我们发现这个函数的重要性质是,假如已知\(S(x,y)\), 那么我们可以在\(O(1)\)的时间内转移得到\(S(x+1,y), S(x-1,y), S(x,y+1), S(x,y-1)\).
于是,我们依照莫队的思想,将所有询问离线下来。
对于询问\(S(x_1,y_1), S(x_2,y_2)\) 按如下的规则进行比较排序:
首先比较\(\frac{x_1}{\sqrt n}\)\(\frac{x_2}{\sqrt n}\)的值,小的在前。
如果这两个值相同的话,再比较\(y_1\)\(y_2\).
从一个询问跳到另一个询问时,我们直接暴力一个一个地把左端点从\(x_1\)移到\(x_2\), 右端点从\(y_1\)移至\(y_2\).
这样对所有询问排序后 ,我们计算左右端点的移动总距离。假设\(Q,n\)同阶。
左端点移动距离\(T_1\): 对于每个大小为\(\sqrt n\)的块,左端点一定要在块内移动。每次移动的距离不超过\(\sqrt n\), 每个块内移动的总次数不超过\(n\) (\(n\)个询问), 总移动的距离不超过\(n\sqrt n\). 这是块内的情况,而左端点在块与块之间移动时,每次移动的距离不超过\(2\sqrt n\), 但是由于只有\(\sqrt n\)个块,因此总移动次数不超过\(\sqrt n\), 总距离\(O(n)\). 综上,左端点移动总距离\(O(n\sqrt n)\).
而右端点呢?更简单:对于左端点在同一个大小为\(\sqrt n\)的块内的询问,右端点是单调右移的,移动总距离不超过\(n\), 又因为有\(\sqrt n\)个块,因此总距离\(O(n\sqrt n)\).
综上,左右端点移动的总距离为\(O(n\sqrt n)\), bzoj 5283这道题已经在\(O(n\sqrt n)\)的复杂度内解决,均摊每次询问\(O(\sqrt n)\).(然而bzoj老爷机毒瘤卡常呜呜呜...)

问题引入——三维莫队

刚才,我们处理的是一个二元函数\(S(x,y)\), 具有重要的转移性质。现在我们拓展这个问题,假设我们有一个三元函数\(f(x,y,z)\), 其可以在\(O(1)\)的时间内转移到\(f(x-1,y,z), f(x+1,y,z), f(x,y-1,z), f(x,y+1,z), f(x,y,z-1), f(x,y,z+1)\)这六个值。有\(Q\)次询问,每次询问一个\(f(x,y,z)\)的值,\(x,y,z\le n\), 是否可以较快速地求出所有询问的答案呢?
假设\(Q, n\le 4.5\times 10^4\).

个人的想法

仿照二维莫队的思路,我们首先对询问进行排序。
我们来形式化地推一发。
设我们的排序方式是第一关键字\(\frac{x}{n^a}\), 第二关键字\(\frac{y}{n^b}\), 第三关键字\(z\).
对于\(x\), 在每个块内移动距离\(O(n^a)\), 总询问数\(O(n)\), 总距离\(O(n^{1+a})\).
对于\(y\), 当\(x\)在同一大块内时,\(y\)每次移动距离\(O(n^b)\), 共\(n\)个询问,\(O(n^{1+b})\). 当\(x\)不在同一大块内时,有\(O(n^{1-a})\)个大块,每个大块\(y\)要移动\(n\)的距离,因此\(O(n^{2-a})\). 综上,\(y\)移动距离\(O(n^{\max(1+b,2-a)})\).
对于\(z\), 我们考虑\(x,y\)的块总共会将\(n\)个询问分成\(O(n^{1-a+1-b})\)类,对于每一类询问,都要移动\(n\)的距离,因此\(z\)移动距离\(O(n^{3-a-b})\).
然后我们来最优化。首先,为了让复杂度不至于达到\(O(n^2)\), \(3-a-b\)必须\(\lt 2\), \(a+b\gt 1\). 而对于\(y\)\(\max(1+b,2-a)\), \(1+b\gt 2-a\)等价于\(a+b\gt 1\), 因此恒满足,\(y\)的复杂度其实就是\(O(n^{1+b})\).
然后就简单了……\(O(n^{1+a}), O(n^{1+b}), O(n^{3-a-b})\), 平衡一下,显然\(a=b=n^\frac{2}{3}\)时取最优,\(O(n^\frac{5}{3})\), 单次均摊\(O(n^\frac{2}{3})\).

后记

重申,本人弱鸡,刚刚从bzoj 5283这道题里得到的启发,推了一发写了此文,若有错误敬请大佬们指出,感激不尽。
关于三维莫队问题,目前没有任何一个人跟我讨论过,纯粹是我自己的一点想法,也没有找其他人检验过(我好菜啊),也没有专门看过此类课题的论文,因此文章内容很可能有错误之处。不过刚才推了这么一大串,最后的核心思想就是一个,通过排序平衡三个端点的移动距离。刚才的内容如果正确,还可以推广到更高维的情况,但是更高维大概只有理论价值,实际上并不会比\(O(n^2)\)暴力快到哪里去。我相信,这个简简单单的问题早已被之前的大佬们解决,我只是发表一点自己的思考而已。如果哪位大佬在这个问题上有更优秀的做法,敬请指出,谢谢。