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. [CCC​2019] Tourism题解

    我们先考虑一下拿部分分: subtask1 考虑因为 \(n < 2k\) ,那么我们的划分一定是从中间某个地方裁开,且满足 \(k\) 的条件的,我们发现当划分点在 \([n\ mod\ k, ...

  2. CF1493E Enormous XOR

    题目传送门. 题意简述:给出长度为 \(n\) 的二进制数 \(l,r\),求 \(\max_{l\leq x\leq y\leq r}\oplus_{i=x}^yi\). 非常搞笑的题目,感觉难度远 ...

  3. 如何使用scp在Linux服务器的后台传输文件?

    目录 一.上传 常规操作 建议 后台运行 二.下载 两台服务器间文件如何传输?对于小文件,可以先从Linux服务器传到window,再传到另一台服务器.对于大的文件,如测序数据.比对文件等.这样的方法 ...

  4. git冲突

    常规操作: # quan @ quandeMacBook-Pro in ~/Desktop/10-01/app_addressing----quan on git:1.0.1.Release o [1 ...

  5. KeepAlived双主模式高可用集群

    keepalived是vrrp协议的实现,原生设计目的是为了高可用ipvs服务,keepalived能够配置文件中的定义生成ipvs规则,并能够对各RS的健康状态进行检测:通过共用的虚拟IP地址对外提 ...

  6. Identity Server 4 从入门到落地(七)—— 控制台客户端

    前面的部分: Identity Server 4 从入门到落地(一)-- 从IdentityServer4.Admin开始 Identity Server 4 从入门到落地(二)-- 理解授权码模式 ...

  7. RocketMQ集群搭建方式

    各角色介绍 Producer:消息的发送者:举例:发信者 Consumer:消息接收者:举例:收信者 Broker:暂存和传输消息:举例:邮局 NameServer:管理Broker:举例:各个邮局的 ...

  8. 【leetcode】15. 3 Sum 双指针 压缩搜索空间

    Given an integer array nums, return all the triplets [nums[i], nums[j], nums[k]] such that i != j, i ...

  9. Dos窗口下中文乱码问题

    最近用Datax工具进行数据同步时,在DOS窗口下出现了中文乱码问题,导致一些错误只能到Log中查看,在网上找了一些方法,记录使用成功的方法. Dos命令:chcp 通过cmd进入Dos命令窗口,执行 ...

  10. Oracle中的instr函数

    最近修改某个条件,由原来输入一个数据修改为可以输入多个,如图所示: 在实现时用到了regexp_substr函数进行分割连接起来的数据,查询时还用到了instr函数进行判断,但出现了问题,当子库存输入 ...