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. 花了30天才肝出来,史上最全面Java设计模式总结,看完再也不会忘

    本文所有内容均节选自<设计模式就该这样学> 序言 Design Patterns: Elements of Reusable Object-Oriented Software(以下简称&l ...

  2. redis实现最简单的锁

    <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifact ...

  3. 使用 SpringBoot 构建一个RESTful API

    目录 背景 创建 SpringBoot 项目/模块 SpringBoot pom.xml api pom.xml 创建 RESTful API 应用 @SpringBootApplication @C ...

  4. 解决 VS Code 无法使用Ctrl+C等快捷键

    背景 VScode 安装 Vim扩展后,无法使用Ctrl+C,Ctrl+X和 Ctrl+V等热键 解决方案 方案一 停用Vim 热键覆盖 # 原因: vim 扩展默认启用Vim ctrl键覆盖常见的V ...

  5. CentOS6安装Zabbix(RPM包)

    1. 系统环境状态 2. 安装zabbix4.0 3. 安装mysql+apache+php环境 4.配置mysql 5.配置zabbix-server 6. 配置apache 7. web安装 1 ...

  6. 大型前端项目 DevOps 沉思录 —— CI 篇

    摘要 DevOps 一词源于 Development 和 Operations 的组合,即将软件交付过程中开发与测试运维的环节通过工具链打通,并通过自动化的测试与监控,减少团队的时间损耗,更加高效稳定 ...

  7. LightningChart JS v.3.3.0全新版本现已发布!

    LightningChart JS v.3.3.0已经发布啦!!! 欢迎了解更多关于最新的性能改进.新的用户界面功能和新的图表类型的信息! WebGL兼容性和新的UI功能 WebGL是Lightnin ...

  8. 关于JSONObject的性能问题

    现有一段代码: private JSONObject override(User user, UserVO vo) { String json = JSON.toJSONString(vo); JSO ...

  9. 用前端表格技术构建医疗SaaS 解决方案

    电子健康档案(Electronic Health Records, EHR)是将患者在所有医疗机构产生的数据(病历.心电图.医疗影像等)以电子化的方式存储,通过在不同的医疗机构之间共享,让患者面对不同 ...

  10. A Child's History of England.21

    There was one tall Norman Knight who rode before the Norman army on a prancing horse, throwing up hi ...