背景介绍
首先,我是一名菜鸡。
前几天在做bzoj 5283时,经过转化后需要处理这样一个二元函数
其中有
组询问,
.
做法是:我们发现这个函数的重要性质是,假如已知
, 那么我们可以在
的时间内转移得到
.
于是,我们依照莫队的思想,将所有询问离线下来。
对于询问
按如下的规则进行比较排序:
首先比较
与
的值,小的在前。
如果这两个值相同的话,再比较
与
.
从一个询问跳到另一个询问时,我们直接暴力一个一个地把左端点从
移到
, 右端点从
移至
.
这样对所有询问排序后 ,我们计算左右端点的移动总距离。假设
同阶。
左端点移动距离
: 对于每个大小为
的块,左端点一定要在块内移动。每次移动的距离不超过
, 每个块内移动的总次数不超过
(
个询问), 总移动的距离不超过
. 这是块内的情况,而左端点在块与块之间移动时,每次移动的距离不超过
, 但是由于只有
个块,因此总移动次数不超过
, 总距离
. 综上,左端点移动总距离
.
而右端点呢?更简单:对于左端点在同一个大小为
的块内的询问,右端点是单调右移的,移动总距离不超过
, 又因为有
个块,因此总距离
.
综上,左右端点移动的总距离为
, bzoj 5283这道题已经在
的复杂度内解决,均摊每次询问
.(然而bzoj老爷机毒瘤卡常呜呜呜…)
问题引入——三维莫队
刚才,我们处理的是一个二元函数
, 具有重要的转移性质。现在我们拓展这个问题,假设我们有一个三元函数
, 其可以在
的时间内转移到
这六个值。有
次询问,每次询问一个
的值,
, 是否可以较快速地求出所有询问的答案呢?
假设
.
个人的想法
仿照二维莫队的思路,我们首先对询问进行排序。
瞎逼猜结论QAQ
注:性急的读者请跳过这一段推导,要读的请抱着批判的态度来读,读不懂或者有疑问请继续看下面,否则我概不负责!!!
一个(显然的)猜测是,既然二维莫队
每次,那我们三维的,是不是可以
每次呢? 对于询问
, 按照
为第一关键字,
为第二关键字,
为第三关键字排序,
转移询问。
我们来复杂度分析(把大小为
的块称作大块,大小为
的块称作小块): 对于
每个大块内每次询问的移动距离是
, 总共
次询问,总移动距离
.
对于
,当
在同一个大块内时,
的每次移动距离不超过
, 一共最多移动
次,总距离
, 对于
不在一个大块内,
的移动距离不超过
, 一共最多
次移动(因为就这么多个大块),总距离
. 综上,
的总移动距离
.
对于
, 总移动距离就是
. 而前者是
,因此右端点总移动次数是…
.
因此,总复杂度为
, 每次询问均摊
!
等等……这个是对的吗……
冷静思考一下:
对于
来说,如果我们按照刚才的方式把
和
分成了若干类,那么这个类别的数目是多少呢?
有
类,
有
类,那一共是……
相乘,
类!!
因此,刚才的分析是错误的,右端点总移动距离为
!
呜呜呜……又要重新推了……
算了,不想试数了,我们来形式化地推一发。
设我们的排序方式是第一关键字
, 第二关键字
, 第三关键字
.
对于
, 在每个块内移动距离
, 总询问数
, 总距离
.
对于
, 当
在同一大块内时,
每次移动距离
, 共
个询问,
. 当
不在同一大块内时,有
个大块,每个大块
要移动
的距离,因此
. 综上,
移动距离
.
对于
, 我们考虑
的块总共会将
个询问分成
类,对于每一类询问,都要移动
的距离,因此
移动距离
.
然后我们来最优化。首先,为了让复杂度不至于达到
,
必须
,
. 而对于
的
,
等价于
, 因此恒满足,
的复杂度其实就是
.
然后就简单了……
, 平衡一下,显然
时取最优,
, 单次均摊
.
后记
重申,本人弱鸡,刚刚从bzoj 5283这道题里得到的启发,推了一发写了此文,若有错误敬请大佬们指出,感激不尽。
关于三维莫队问题,目前没有任何一个人跟我讨论过,纯粹是我自己的一点想法,也没有找其他人检验过(我好菜啊),也没有专门看过此类课题的论文,因此文章内容很可能有错误之处。不过刚才推了这么一大串,最后的核心思想就是一个,通过排序平衡三个端点的移动距离。刚才的内容如果正确,还可以推广到更高维的情况,但是更高维大概只有理论价值,实际上并不会比
暴力快到哪里去。我相信,这个简简单单的问题早已被之前的大佬们解决,我只是发表一点自己的思考而已。如果哪位大佬在这个问题上有更优秀的做法,敬请指出,谢谢。