2 条题解
-
1oistream (oistream) LV 8 MOD @ 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)我。
-
02020-05-27 11:32:14@
再讲解一下如何理解这道题:
说白了,就是有 \(n\) 个矩形,每个矩形有一定的颜色(透明的可以直接忽略),然后用类似铺地毯的方式铺在一个大的网格上,后铺上的矩形会盖住先前铺上的矩形,要输出最后整个网格的状态。
- 1