LuoguP2556 [AHOI2002]黑白图像压缩 题解
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]黑白图像压缩 题解的更多相关文章
- 洛谷——P2556 [AHOI2002]黑白图像压缩
P2556 [AHOI2002]黑白图像压缩 题目描述 选修基础生物基因学的时候, 小可可在家里做了一次图像学试验. 她知道:整个图像其实就是若干个图像点(称作像素)的序列,假定序列中像素的个数总是 ...
- 洛谷P2556 [AHOI2002] 黑白图像压缩 [模拟]
题目传送门 黑白图像压缩 题目描述 选修基础生物基因学的时候, 小可可在家里做了一次图像学试验. 她知道:整个图像其实就是若干个图像点(称作像素)的序列,假定序列中像素的个数总是 8 的倍数, 于是每 ...
- P2561 [AHOI2002]黑白瓷砖
$ \color{#0066ff}{ 题目描述 }$ \(\color{#0066ff}{输入格式}\) 文件中以一行的形式存放一个正整数 n , n ≤ 20 . \(\color{#0066ff} ...
- [wikioi2926][AHOI2002]黑白瓷砖(Polya定理)
小可可在课余的时候受美术老师的委派从事一项漆绘瓷砖的任务.首先把n(n+1)/2块正六边形瓷砖拼成三角形的形状,右图给出了n=3时拼成的“瓷砖三角形”.然后把每一块瓷砖漆成纯白色或者纯黑色,而且每块瓷 ...
- 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 ...
- 尝试一下LLJ大佬的理论AC大法
1.BZOJ 3522 Poi2014 Hotel DFS 给定一棵树,求有多少无序三元组(x,y,z)满足x,y,z互不相等且Dis(x,y)=Dis(y,z)=Dis(x,z) 枚举中心点,分别d ...
- 「算法笔记」Polya 定理
一.前置概念 接下来的这些定义摘自 置换群 - OI Wiki. 1. 群 若集合 \(s\neq \varnothing\) 和 \(S\) 上的运算 \(\cdot\) 构成的代数结构 \((S, ...
- [题解+总结]动态规划大合集II
1.前言 大合集总共14道题,出自江哥之手(这就没什么好戏了),做得让人花枝乱颤.虽说大部分是NOIP难度,也有简单的几道题目,但是还是做的很辛苦,有几道题几乎没思路,下面一道道边看边分析一下. 2. ...
- 【BZOJ】3319: 黑白树
http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...
随机推荐
- 没有人比我更会使用集合!对, 是dart中的集合
目录 简介 List的使用 Set的使用 Map的使用 常见的集合方法 总结 简介 dart中的集合有三个,分别是list,set和map.dart在dart:core包中提供了对于这三种集合非常有用 ...
- Vulnhub-Empire: LupinOne题解
Vulnhub-Empire: LupinOne题解 本靶机为Vulnhub上Empire系列之LupinOne,地址:EMPIRE: LUPINONE 扫描与发现 利用arp-scan命令扫描靶机I ...
- vue-cli的安装步骤
1.安装Node.js 在Node.js官网 https://nodejs.org/zh-cn/下载安装包,修改安装路径到其它盘,如 G:\Program Files 2.设置 cnpm的下载路径和缓 ...
- Codeforces 690A2 - Collective Mindsets (medium)
Codeforces 题面传送门 & 洛谷题面传送门 一道脑筋急转弯的结论题. 首先我们考虑对于某个特定的金币数 \(m\),有哪些 \(n\) 满足条件.考虑最 naive 的情况,\(m= ...
- R包 tidyverse 分列
代码: 1 library(tidyverse) 2 separate(data = df,col=chr_pos,into=c("chr","pos"),se ...
- Linux生产应用常见习题汇总
1.如果想修改开机内核参数,应该修改哪个文件? C A./dev/sda1 (scsi sata sas,是第1块盘的第1个分区) B./etc/fstab (开机磁盘自动挂载配置文件) C./etc ...
- 在 vscode.dev 中直接运行 Python !纯浏览器环境,无后端!
其实有挺长一段时间没有写自己的 VS Code 插件了! 还是要感谢我们 DevDiv 组的 Flexible Friday 活动,让我可以在工作日研究自己感兴趣的项目. Flexible Frida ...
- 业务逻辑审批流、审批流、业务、逻辑、面向对象、工作方式【c#】
------需求分析:--------1.先按照实际线下流程说这是什么事情,实际要干什么.2.再转换为面向对象-页面的操作流程,演示demo3.再与相关人员沟通是否可行需要什么地方修正.4.最终:线上 ...
- 图形学3D渲染管线学习
图形学3D渲染管线 DX和OpenGL左右手坐标系不同,会有一些差距,得出的矩阵会不一样; OpenGL的投影平面不是视景体的近截面: 顶点(vertexs) 顶点坐标,颜色,法线,纹理坐标(UV), ...
- 容器之分类与各种测试(四)——unordered-multiset
unordered-multiset是不定序关联式容器,其底部是通过哈希表实现功能. (ps:黑色框就是bucket,白色框即为bucket上挂载的元素) 为了提高查找效率,bucket(篮子)的数量 ...