zoukankan      html  css  js  c++  java
  • 关于三维莫队问题的一些思考和探究

    手动博客搬家: 本文发表于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)组询问,(xle yle 2.5 imes 10^5, Qle 2.5 imes 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)个询问), 总移动的距离不超过(nsqrt n). 这是块内的情况,而左端点在块与块之间移动时,每次移动的距离不超过(2sqrt n), 但是由于只有(sqrt n)个块,因此总移动次数不超过(sqrt n), 总距离(O(n)). 综上,左端点移动总距离(O(nsqrt n)).
    而右端点呢?更简单:对于左端点在同一个大小为(sqrt n)的块内的询问,右端点是单调右移的,移动总距离不超过(n), 又因为有(sqrt n)个块,因此总距离(O(nsqrt n)).
    综上,左右端点移动的总距离为(O(nsqrt n)), bzoj 5283这道题已经在(O(nsqrt 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,zle n), 是否可以较快速地求出所有询问的答案呢?
    假设(Q, nle 4.5 imes 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+bgt 1). 而对于(y)(max(1+b,2-a)), (1+bgt 2-a)等价于(a+bgt 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))暴力快到哪里去。我相信,这个简简单单的问题早已被之前的大佬们解决,我只是发表一点自己的思考而已。如果哪位大佬在这个问题上有更优秀的做法,敬请指出,谢谢。

  • 相关阅读:
    [oracle 使用(1)] win7/10 下Oracle10g的安装与卸载
    [原创]利用爬虫技术获取网页数据,以及想要的指定数据
    [mysql使用(1)] 64位Linux下安装mysql-5.7.13-linux-glibc2.5-x86_64
    aop 常见的问题
    Git技巧:右键菜单怎么去除?
    jrebel激活
    python与mysql连接
    linux下mysql的安装
    Linux下jdk和tomcat安装
    Lotto
  • 原文地址:https://www.cnblogs.com/suncongbo/p/10305737.html
Copyright © 2011-2022 走看看