关于三维莫队问题的一些思考和探究

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/suncongbo/article/details/82771387

背景介绍

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

问题引入——三维莫队

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

个人的想法

仿照二维莫队的思路,我们首先对询问进行排序。
瞎逼猜结论QAQ
注:性急的读者请跳过这一段推导,要读的请抱着批判的态度来读,读不懂或者有疑问请继续看下面,否则我概不负责!!!
一个(显然的)猜测是,既然二维莫队 O ( n 1 2 ) O(n^\frac{1}{2}) 每次,那我们三维的,是不是可以 O ( n 2 3 ) O(n^\frac{2}{3}) 每次呢? 对于询问 f ( x , y , z ) f(x,y,z) , 按照 x n 2 3 \frac{x}{n^\frac{2}{3}} 为第一关键字, y n 1 3 \frac{y}{n^\frac{1}{3}} 为第二关键字, z z 为第三关键字排序, O ( 1 ) O(1) 转移询问。
我们来复杂度分析(把大小为 n 2 3 n^\frac{2}{3} 的块称作大块,大小为 n 1 3 n^\frac{1}{3} 的块称作小块): 对于 x x 每个大块内每次询问的移动距离是 n 2 3 n^\frac{2}{3} , 总共 n n 次询问,总移动距离 O ( n 5 3 ) O(n^\frac{5}{3}) .
对于 y y ,当 x x 在同一个大块内时, y y 的每次移动距离不超过 n 1 3 n^\frac{1}{3} , 一共最多移动 n n 次,总距离 n 4 3 n^\frac{4}{3} , 对于 x x 不在一个大块内, y y 的移动距离不超过 n n , 一共最多 n 1 3 n^\frac{1}{3} 次移动(因为就这么多个大块),总距离 n 4 3 n^\frac{4}{3} . 综上, y y 的总移动距离 O ( n 4 3 ) O(n^\frac{4}{3}) .
对于 z z , 总移动距离就是 O ( x , y × n ) O(x,y都不同的询问个数\times n) . 而前者是 O ( n 2 3 ) O(n^\frac{2}{3}) ,因此右端点总移动次数是… O ( n 5 3 ) O(n^\frac{5}{3}) .
因此,总复杂度为 O ( n 5 3 ) O(n^\frac{5}{3}) , 每次询问均摊 O ( n 2 3 ) O(n^\frac{2}{3})


等等……这个是对的吗……
冷静思考一下:
对于 z z 来说,如果我们按照刚才的方式把 x x y y 分成了若干类,那么这个类别的数目是多少呢?
x x n 1 3 n^\frac{1}{3} 类, y y n 2 3 n^\frac{2}{3} 类,那一共是……
相乘, n n 类!!
因此,刚才的分析是错误的,右端点总移动距离为 O ( n 2 ) O(n^2)
呜呜呜……又要重新推了……
算了,不想试数了,我们来形式化地推一发。
设我们的排序方式是第一关键字 x n a \frac{x}{n^a} , 第二关键字 y n b \frac{y}{n^b} , 第三关键字 z z .
对于 x x , 在每个块内移动距离 O ( n a ) O(n^a) , 总询问数 O ( n ) O(n) , 总距离 O ( n 1 + a ) O(n^{1+a}) .
对于 y y , 当 x x 在同一大块内时, y y 每次移动距离 O ( n b ) O(n^b) , 共 n n 个询问, O ( n 1 + b ) O(n^{1+b}) . 当 x x 不在同一大块内时,有 O ( n 1 a ) O(n^{1-a}) 个大块,每个大块 y y 要移动 n n 的距离,因此 O ( n 2 a ) O(n^{2-a}) . 综上, y y 移动距离 O ( n max ( 1 + b , 2 a ) ) O(n^{\max(1+b,2-a)}) .
对于 z z , 我们考虑 x , y x,y 的块总共会将 n n 个询问分成 O ( n 1 a + 1 b ) O(n^{1-a+1-b}) 类,对于每一类询问,都要移动 n n 的距离,因此 z z 移动距离 O ( n 3 a b ) O(n^{3-a-b}) .
然后我们来最优化。首先,为了让复杂度不至于达到 O ( n 2 ) O(n^2) , 3 a b 3-a-b 必须 < 2 \lt 2 , a + b > 1 a+b\gt 1 . 而对于 y y max ( 1 + b , 2 a ) \max(1+b,2-a) , 1 + b > 2 a 1+b\gt 2-a 等价于 a + b > 1 a+b\gt 1 , 因此恒满足, y y 的复杂度其实就是 O ( n 1 + b ) O(n^{1+b}) .
然后就简单了…… O ( n 1 + a ) , O ( n 1 + b ) , O ( n 3 a b ) O(n^{1+a}), O(n^{1+b}), O(n^{3-a-b}) , 平衡一下,显然 a = b = n 2 3 a=b=n^\frac{2}{3} 时取最优, O ( n 5 3 ) O(n^\frac{5}{3}) , 单次均摊 O ( n 2 3 ) O(n^\frac{2}{3}) .

后记

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

猜你喜欢

转载自blog.csdn.net/suncongbo/article/details/82771387