1 条题解

  • 0
    @ 2025-8-24 22:23:37

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar vzcx_host
    vzcx 系列第一站

    搬运于2025-08-24 22:23:37,当前版本为作者最后更新于2021-07-11 14:46:45,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    吐槽


    16MB 的空间你交互库确定不会 MLE?

    思路

    先分析一下伪代码,我们想拿 100100 分则 maxA+maxBmaxA + maxB 必须为 1010,因此,二进制存储是不行的了(好像一分都拿不到)。

    我们不一定只能用二进制,可以考虑更高的进制。比如说三进制,这样我们就把 33 个位置压成一位(反正 1024010240 长度的数组可以随便用),将其中一个位置变成 11,其它位置为 00,表示此位的数码。比如三进制数 (2120)3(2120)_3,最后的数组即 001 010 001 100。比大小的时候只需要将 bb 也分解,从上往下一位一位比即可。

    我们可以先比 bb 的最高位在数组中的位置,若 aa 的对应位相同,则比次高位,直到找到一个位置不同。若没有不同,则 a=ba=b。否则,我们暴力寻找 aa 此位对于 bb 而言更大还是更小。

    kk 进制我们的操作次数为 maxA=logk4096,maxB=maxA+k2maxA=\log_k4096,maxB=maxA+\frac{k}{2}k=6k=6 左右时 maxA+maxBmaxA + maxB 最小,约为 1212

    哪里出了问题呢,按照以上方法,函数 comparea,ba,b 相差越大,则 bit_get 调用次数越少,很不均匀。

    为了更均匀地调用 bit_get,我们对每一个数码采取不同的进制。

    假设我们只用 44 位,即 maxA=4maxA=4,若最高位不同我们可以找 66 次,所以最高位用 1212 进制。相同我们只需要比 11 次,此时考虑第 22 位,不同我们可以找 55 次,所以第 22 位采用 1010 进制。不同同样只需比一次。因此,从高位到低位进制分别为 1212 进制,1010 进制,88 进制,66 进制。

    33 位可以表示 14×12×10=168014\times12\times10=1680 个数。

    44 位可以表示 12×10×8×6=576012\times10\times8\times6=5760 个数。

    55 位可以表示 10×8×6×4×2=384010\times8\times6\times4\times2=3840 个数。

    只有 44 位是能表示所有的数。最后再注意一下第二维下标从 11 开始就差不多了。

    我的思路和官方题解几乎一样,但 MLEMLE 了(?)。

    • 1

    信息

    ID
    5760
    时间
    1000ms
    内存
    17MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者