题解

2 条题解

  • 1
    @ 2020-05-27 08:25:06

    这道题目乍一眼看是道很裸的暴力:给了 \(20\) 秒,充足的时间,然鹅,暴力的结果是这样子滴:点这儿

    如果直接记录 RGB 颜色,然后挨个处理,那样相当于建了三个 \((7\times 10^3)^2=4.9\times 10^7\) 的数组,已经大于了 \(10^8\),在 \(256\) MB 的限制下大概率会 MLE 了(最多开 \(5\times 10^7\) 的数组能够确保 AC,再大就得看 RP 了)。

    所以,就不能直接记录颜色了,那么该怎么办呢?我们采用的策略是将 RGB 颜色 映射 到一个方便记录的东西上。这个映射必须满足:

    • 同样的颜色映射到同样的东西;
    • 不同的颜色映射到不同的东西。

    注意到 RGB 色都很小(不超过 \(3\) 位),所以我们完全可以把 RGB 三个整数 合在一个整数 里记。比如 \(255,254,253\) 完全可以记成 \(255254253\),加起来九位,int 刚好能存下。

    具体来说,就是 \(r,g,b\) 压缩成 \(x=r\times 10^6+g\times 10^3+b\)。

    压缩的代码:

    int toInt(int r,int g,int b)
    {
        return r*1000000+g*1000+b;
    }
    

    解压缩的代码(Color 结构体是个包含 r,g,b 三个成员的类型):

    Color toColor(int x)
    {
        Color c;
        c.r=x/1000000;
        x%=1000000;//注意此处要取模,不然下一个获得的就是 255254,而不是254 了
        c.g=x/1000;
        x%=1000;
        c.b=x;
        return c;
    }
    

    以上压缩和解压缩都是 \(\mathcal{O}(1)\) 的复杂度,因此不太影响。

    上面那种压缩方法已经够使了,但是还是有浪费。注意到 RGB 的最高位最多只是 \(2\),用十进制来压缩,最高位有点浪费。又由于 \(255=2^8-1\),因此考虑二进制压缩。

    将每一个 RGB 参数转为 二进制,并利用位移的方法放进一个整数里。int 类型有 \(31\) 位(符号位不算),我们只利用了 \(24\) 位,甚至差一点还能再存下一个参数。

    如果有更好的方法,欢迎补(diao)充(da)我。

  • 0
    @ 2020-05-27 11:32:14

    再讲解一下如何理解这道题:

    说白了,就是有 \(n\) 个矩形,每个矩形有一定的颜色(透明的可以直接忽略),然后用类似铺地毯的方式铺在一个大的网格上,后铺上的矩形会盖住先前铺上的矩形,要输出最后整个网格的状态。

  • 1

信息

ID
1024
难度
3
分类
模拟 点击显示
标签
递交数
9
已通过
2
通过率
22%
被复制
1
上传者