Content

题目描述太过于繁琐而无法简化,请前往原题面查看。

数据范围:\(1\leqslant n\leqslant 8\times 10^4\)。

Solution & Code

一个个人认为比较繁琐的模拟,但是思维难度奇低。

可能我的方法和题解区里面的大部分题解相比过程可能要复杂些,果然还是把简单问题想复杂化了……但是思路应该是清晰的。

话回正题,我们将所要做的程序分为四部分,本题解根据这四部分分开讲解,并且代码也只会分部分给。

Part 1 读入&转化为二进制

我们将这 \(\frac n8\) 个数读入进来之后,首先最主要的就是将这些数转化为八位的二进制数。我们可以考虑开个空字符串,每一轮将当前数 \(x\bmod 2\) 的余数放到字符串的最后面,然后再 \(x\leftarrow \left\lfloor\frac x2\right\rfloor\)。最后再将整个字符串翻转过来就好了。注意,如果原数转换为二进制不足 \(8\) 位,则要在前面补足前导零。最后将得到的 \(\frac n8\) 个字符串按顺序拼接在一起,得到大字符串 \(t\)。

n = Rint;
F(int, i, 1, n / 8) {
int x = Rint; string tmp = "";
while(x) tmp += (x % 2 + '0'), x /= 2;
int len = tmp.size();
if(len < 8) F(int, j, 1, 8 - len) tmp += "0";
reverse(tmp.begin(), tmp.end()); //由于我们得到的字符串是反过来的,因此需要翻转一下,用到的是 STL 中的 reverse 函数。
t += tmp;
}

Part 2 分段

这一个部分比较简单,我们扫一遍字符串 \(t\),一碰到和前面的字符不相等的情况就直接新建一段,存储当前这一段子串(其实只要存储第一个字符)及其长度。

string tmp = "";
F(int, i, 0, n) {
if((i == 0 || t[i] == t[i - 1]) && i != n) tmp += t[i];
else a[++cnt] = (node){tmp, (int)tmp.size()}, tmp.clear(), tmp += t[i];
}

Part 3 用二进制表示片段

有了前面的二进制转化的借鉴,这里就不用我再多说了吧,直接上代码。

F(int, i, 1, cnt) {
newt[i] += a[i].s[0];
int p = a[i].t;
string tmp2 = "";
while(p) tmp2 += (p % 2 + '0'), p /= 2;
reverse(tmp2.begin(), tmp2.end());
int len = tmp2.size();
if(len + 1 < 8) F(int, j, 1, 7 - len) newt[i] += "0";
newt[i] += tmp2;
}

Part 4 转化为十进制&输出

首先看二进制如何转化为十进制的问题。我们都知道,二进制的规则是“满二进一”,所以不难发现,从低到高的第 \(i\) 位上面的数字 \(x\) 转换到十进制就是 \(x\times 2^{i-1}\)

因此,我们按照这种思路将十进制转换为二进制就很简单了,然后这道题目就这么愉快地做完了。

放上最后一部分的代码。

F(int, i, 1, cnt) {
int ans = 0;
F(int, j, 0, 7) ans += (newt[i][j] - '0') * (1 << (7 - j));
printf("%d%c", ans, " \n"[i == cnt]);
}

总体来说思维难度不是很大(起码我觉得比题解区的好想),实现起来有点麻烦,但也是一种行之有效的方法。

最终代码就把上面着四个部分拼接起来就好了,那么就不放完整代码了。

LuoguP2556 [AHOI2002]黑白图像压缩 题解的更多相关文章

  1. 洛谷——P2556 [AHOI2002]黑白图像压缩

    P2556 [AHOI2002]黑白图像压缩 题目描述 选修基础生物基因学的时候, 小可可在家里做了一次图像学试验. 她知道:整个图像其实就是若干个图像点(称作像素)的序列,假定序列中像素的个数总是 ...

  2. 洛谷P2556 [AHOI2002] 黑白图像压缩 [模拟]

    题目传送门 黑白图像压缩 题目描述 选修基础生物基因学的时候, 小可可在家里做了一次图像学试验. 她知道:整个图像其实就是若干个图像点(称作像素)的序列,假定序列中像素的个数总是 8 的倍数, 于是每 ...

  3. P2561 [AHOI2002]黑白瓷砖

    $ \color{#0066ff}{ 题目描述 }$ \(\color{#0066ff}{输入格式}\) 文件中以一行的形式存放一个正整数 n , n ≤ 20 . \(\color{#0066ff} ...

  4. [wikioi2926][AHOI2002]黑白瓷砖(Polya定理)

    小可可在课余的时候受美术老师的委派从事一项漆绘瓷砖的任务.首先把n(n+1)/2块正六边形瓷砖拼成三角形的形状,右图给出了n=3时拼成的“瓷砖三角形”.然后把每一块瓷砖漆成纯白色或者纯黑色,而且每块瓷 ...

  5. Codeforces Round #368 (Div. 2) A. Brain's Photos 水题

    A. Brain's Photos 题目连接: http://www.codeforces.com/contest/707/problem/A Description Small, but very ...

  6. 尝试一下LLJ大佬的理论AC大法

    1.BZOJ 3522 Poi2014 Hotel DFS 给定一棵树,求有多少无序三元组(x,y,z)满足x,y,z互不相等且Dis(x,y)=Dis(y,z)=Dis(x,z) 枚举中心点,分别d ...

  7. 「算法笔记」Polya 定理

    一.前置概念 接下来的这些定义摘自 置换群 - OI Wiki. 1. 群 若集合 \(s\neq \varnothing\) 和 \(S\) 上的运算 \(\cdot\) 构成的代数结构 \((S, ...

  8. [题解+总结]动态规划大合集II

    1.前言 大合集总共14道题,出自江哥之手(这就没什么好戏了),做得让人花枝乱颤.虽说大部分是NOIP难度,也有简单的几道题目,但是还是做的很辛苦,有几道题几乎没思路,下面一道道边看边分析一下. 2. ...

  9. 【BZOJ】3319: 黑白树

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...

随机推荐

  1. FastJson测试用例

    基础测试 package com.ai; import com.ai.test.daily.Student; import com.alibaba.fastjson.JSON; import com. ...

  2. 解决springboot启动日志异常问题

    问题描述:springboot启动异常,启动后没有日志打印. 问题原因:slf4j日志实现重复,找不到对应实现类. 问题应对: 1. 是不是项目没起来---->打印的日志数据,到这里就不打印了, ...

  3. git不显示提交代码

    今天提交代码找不到提交的具体代码,找了好半天,最后发现是右边能下拉能拉下去,尴尬.

  4. Cannot connect to runtime process

    发生一个或多个错误. 未能启动调试适配器.可以在输出窗口中查看额外的信息. Cannot connect to runtime process, timeout after 10000 ms (rea ...

  5. 常见 js 数组方法使用详解

    数组常用方法总结 concat filter map some every reduce sort includes join some every 语法:array.every(function(c ...

  6. R语言与医学统计图形-【14】ggplot2几何对象之直方密度图

    ggplot2绘图系统--几何对象之直方图.密度图 1.直方图 参数. geom_histogram(mapping = , data = , stat = 'bin', #统计变换,概率密度为den ...

  7. perl练习——计算点突变

    题目来源:http://rosalind.info/problems/hamm/ 一.程序目的:计算序列点突变(Point Mutations) 输入: GAGCCTACTAACGGGAT CATCG ...

  8. open 函数小结

    umask 掩码 open 函数的时候需要注意,掩码去反之后和设置的值想与,得到真正的值. 可以在命令行 使用umask 来查询 umask 000 设置掩码

  9. linux系统中安装JDK

    安装之前的准备工作 查看系统中之前安装好的JDK java –version rpm -qa | grep java 卸载JDK (以java-1.7.0-openjdk-1.7.0.45-2.4.3 ...

  10. 日常Java 2021/11/21

    Java文档注释 Java支持三种注释方式.前两种分别是Ⅱ和/产*,第三种被称作说明注释,它以产开始,以*I结束.说明注释允许你在程序中嵌入关于程序的信息.你可以使用javadoc工具软件来生成信息, ...