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. App 端自动化的最佳方案,完全解放双手!

    1. 前言 大家好,我是安果! 之前写过一篇文章,文中提出了一种方案,可以实现每天自动给微信群群发新闻早报 如何利用 Python 爬虫实现给微信群发新闻早报?(详细) 但是对于很多人来说,首先编写一 ...

  2. Windows系统及硬件信息读取

    Windows桌面端开发常常会需要读取系统信息或硬件信息作为用户标识,比如用于确认该设配是否已经激活程序.也可以使用随机生成的UUID来作为唯一标识,但是如果重装系统或重装软件都有可能导致标识丢失,因 ...

  3. git使用小技巧

    1. 合并一个分支的某次提交到另一个分支上 例如 将dev的某次提交 asfdiwehfsalkdnva872383 合并到master # git checkout master # git che ...

  4. Redis 很屌,不懂使用规范就糟蹋了

    这可能是最中肯的 Redis 使用规范了 码哥,昨天我被公司 Leader 批评了. 我在单身红娘婚恋类型互联网公司工作,在双十一推出下单就送女朋友的活动. 谁曾想,凌晨 12 点之后,用户量暴增,出 ...

  5. Codeforces 1442D - Sum(找性质+分治+背包)

    Codeforces 题面传送门 & 洛谷题面传送门 智商掉线/ll 本来以为是个奇怪的反悔贪心,然后便一直往反悔贪心的方向想就没想出来,看了题解才发现是个 nb 结论题. Conclusio ...

  6. 在WEB网页上模拟人的操作(批量操作)

    思路:selenium IDE网页测试工具+firefox浏览器=>录制网页操作脚本->导出为Perl/python/Ruby/C/R等语言 参考: (1)selenium IDE网页测试 ...

  7. Identity Server 4 从入门到落地(五)—— 使用Ajax访问Web Api

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

  8. day02 Linux基础

    day02 Linux基础 1.什么是服务器 服务器,也称伺服器,是提供计算服务的设备.由于服务器需要响应服务请求,并进行处理,因 此一般来说服务器应具备承担服务并且保障服务的能力. windows: ...

  9. 一起手写吧!promise.all

    Promise.all 接收一个 promise 对象的数组作为参数,当这个数组里的所有 promise 对象全部变为resolve或 有 reject 状态出现的时候,它才会去调用 .then 方法 ...

  10. NuxtJS的AsyncData和Fetch使用详解

    asyncData 简介 asyncData 可以用来在客户端加载 Data 数据之前对其做一些处理,也可以在此发起异步请求,提前设置数据,这样在客户端加载页面的时候,就会直接加载提前渲染好并带有数据 ...