其他分享
首页 > 其他分享> > CF1078E Negative Time Summation 题解

CF1078E Negative Time Summation 题解

作者:互联网

CF1078E Negative Time Summation 题解

一些说明

简要题意

在无限大的网格图的 \((0, 0)\) 和 \((0, 1)\) 位置有两个二进制数 \(a, b\),其余位置为空,你有一个机器人,初始在 \((0, 0)\) 位置,支持以下九种操作:

  1. 0 / 1,表示把机器人当前位置填上数字 \(0/1\)。
  2. e,表示把机器人当前位置清空。
  3. s,表示这次操作什么都不做。
  4. l / r / u / d,表示机器人向左 / 右 / 上 / 下移动一格。
  5. t,撤销之前所做的 \(\rm num + 1\) 步操作(不会撤销 “撤销操作”),其中 \(\rm num\) 表示当前位置的数字,特别地,若当前位置为空,则什么都不做。

你要构造出一个操作序列,计算出 \(a + b\) 的二进制表示,写在网格图内并让机器人站在答案的最高位,总操作次数不能超过 \(10^5\)。

多测和样例都是假的,题目就是要你构造一个万能的操作序列。

\(1 \le a, b < 2^{30}\)。

题目分析

最好先写一个操作可视化的程序,否则手模起来十分困难。

观察给出的操作,前八种操作都是普普通通的 “顺序结构”,只有第九种操作中出现了类似于 “分支结构” 的功能,考虑以这个操作为突破口进行分析。

根据撤销次数的不同,我们很自然的想到用移动 + 撤销来分类,即:

lst.gif slt.gif rlt.gif

按照这样的方法,就可以把三类格子区分开了。

但是我们没有判断操作,即使区分开三种格子,依然还要做同一件事,只不过做这件事的位置不同了,所以我们的思路就是:“让没用的格子做无用功”。

请认真理解上面这段话,这段话的核心思想贯穿整道题的解答。

现在再回来拆分一下加法的过程:

  1. 由于 \(0\) 和空白格的性质不尽相同,先加上前导零,补满 \(30\) 位。
  2. 统计每个数位上 \(1\) 的个数,用一些 \(0\) 或 \(1\) 来表示(以 \(0\) 为例)。
  3. 从低位开始,对 \(0\) 的个数计数,并考虑进位和当前位的真实结果。

之后就是对每一步分别构造方案了。

Tips

构造方案前,还有一些小 Tips 可以让你少走弯路:

backup1.gif backup2.gif

构造方案

加前导零

朴素的想法是从高到低考虑每一位,如果当前位置是空格就加上一个 \(0\)。

回顾前面提到的核心思想,我们没有判断操作,所以每个位置都要放一个 \(0\),但是可以通过位置的变化来让后面的 \(0\) 放在无用的位置上,最后把它删掉即可。

构造方案比较简单,首先在下方两格的位置建一堵墙,之后从下面走上去,通过分类中的第二类操作将空白格和 \(0\) 或 \(1\) 分开,空白格就停下,\(0\) 或 \(1\) 就下来,然后在当前位置放 \(0\),通过建的墙归位后继续考虑下一位,以 \(1010_2\) 为例:

zero.gif

补完之后把下面两行删掉即可,对于上面的数,翻上去再做一遍即可。

统计个数

依然是核心思想,由于 \(1\) 的个数不确定,所以一定要放两个 \(0\),那么把 \(0\) 和 \(1\) 分开计数,分别记在左右两列,再把表示 \(0\) 的那一列删掉即可,一些可能的实现细节:

  1. 这一列有可能是两个 \(0\) 或两个 \(1\),需要找到下一行的空位放 \(0\) 来计数。
  2. 回退时依然通过原数归位,然后把原数删掉。

one.gif

我这样做会右偏一格,但无伤大雅,因为我们知道它的相对位置,你也可以相应的添加一些 lr 来使它对齐。

考虑进位,计算结果

现在我们得到了一些 \(0\),每一列有 \(0/1/2\) 个,且严格按照从上到下给出。

提前建好下面的墙,以及右侧两个边界的 \(0\),同理,计算完成后删掉即可。

先考虑进位,如果当前位置存在两个 \(0\),那么一定会进位,直接去左一列找最靠上的空位放 \(0\),但如果没有,就会在当前列放一个 \(0\),于是要考虑删掉这个 \(0\),此时有三种不同情况,对它们分别讨论,利用墙定位和右面已经计算完毕的性质,逐个击破即可,具体实现可以参考动图。

下面考虑计算结果,此时每一位有 \(0\sim 3\) 个 \(0\),他们的奇偶性就是这一位的答案,依然是核心思想,这里既会出现 \(0\),也会出现 \(1\),那么我们必须要 \(01\) 都放,而要让非答案的放在没用的位置上,对这三个位置分类讨论即可,具体实现可以参考动图。

calc.gif

问题到这里也就结束了,不过由于我们补充了 \(30\) 位的前导零,为了更好看,也可以把前导零去掉,方法很容易构造:

clear.gif

最后的方案就是:

<-------------------------- 加前导零 -------------------------->
dd
<---------------- 下面 ---------------->
0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0u
sut0dtrsut0dtrsut0dtrsut0dtrsut0dtrsut0dtrsut0dtrsut0dtrsut0dtrsut0dtrsut0dtrsut0dtrsut0dtrsut0dtrsut0dtr
sut0dtrsut0dtrsut0dtrsut0dtrsut0dtrsut0dtrsut0dtrsut0dtrsut0dtrsut0dtrsut0dtrsut0dtrsut0dtrsut0dtrsut0dtr
delelelelelelelelelelelelelelelelelelelelelelelelelelelelelele
uerererererererererererererererererererererererererererererere
uuuul
<---------------- 上面 ---------------->
0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0l0d
sdt0utrsdt0utrsdt0utrsdt0utrsdt0utrsdt0utrsdt0utrsdt0utrsdt0utrsdt0utrsdt0utrsdt0utrsdt0utrsdt0utrsdt0utr
sdt0utrsdt0utrsdt0utrsdt0utrsdt0utrsdt0utrsdt0utrsdt0utrsdt0utrsdt0utrsdt0utrsdt0utrsdt0utrsdt0utrsdt0utr
uelelelelelelelelelelelelelelelelelelelelelelelelelelelelelele
derererererererererererererererererererererererererererererere
ddddl
<-------------------------- 统计个数 -------------------------->
uurlstdd0uurltleurlstddddut0uudtuurltledddedeul
uurlstdd0uurltleurlstddddut0uudtuurltledddedeul
uurlstdd0uurltleurlstddddut0uudtuurltledddedeul
uurlstdd0uurltleurlstddddut0uudtuurltledddedeul
uurlstdd0uurltleurlstddddut0uudtuurltledddedeul
uurlstdd0uurltleurlstddddut0uudtuurltledddedeul
uurlstdd0uurltleurlstddddut0uudtuurltledddedeul
uurlstdd0uurltleurlstddddut0uudtuurltledddedeul
uurlstdd0uurltleurlstddddut0uudtuurltledddedeul
uurlstdd0uurltleurlstddddut0uudtuurltledddedeul
uurlstdd0uurltleurlstddddut0uudtuurltledddedeul
uurlstdd0uurltleurlstddddut0uudtuurltledddedeul
uurlstdd0uurltleurlstddddut0uudtuurltledddedeul
uurlstdd0uurltleurlstddddut0uudtuurltledddedeul
uurlstdd0uurltleurlstddddut0uudtuurltledddedeul
uurlstdd0uurltleurlstddddut0uudtuurltledddedeul
uurlstdd0uurltleurlstddddut0uudtuurltledddedeul
uurlstdd0uurltleurlstddddut0uudtuurltledddedeul
uurlstdd0uurltleurlstddddut0uudtuurltledddedeul
uurlstdd0uurltleurlstddddut0uudtuurltledddedeul
uurlstdd0uurltleurlstddddut0uudtuurltledddedeul
uurlstdd0uurltleurlstddddut0uudtuurltledddedeul
uurlstdd0uurltleurlstddddut0uudtuurltledddedeul
uurlstdd0uurltleurlstddddut0uudtuurltledddedeul
uurlstdd0uurltleurlstddddut0uudtuurltledddedeul
uurlstdd0uurltleurlstddddut0uudtuurltledddedeul
uurlstdd0uurltleurlstddddut0uudtuurltledddedeul
uurlstdd0uurltleurlstddddut0uudtuurltledddedeul
uurlstdd0uurltleurlstddddut0uudtuurltledddedeul
uurlstdd0uurltleurlstddddut0uudtuurltledddedeul
<-------------------------- 进位计算 -------------------------->
<---------------- 造墙 ---------------->
rddddll0r0r0r0r0r0r0r0r0r0r0r0r0r0r0r0r0r0r0r0r0r0r0r0r0r0r0r0r0r0r0r0r0uuuur0r0lld
<---------------- 计算 ---------------->
lrtudutdut0ddtdtuurtrdutsutluutdlddutueddtdtdtrrruultltlutdtut0u1dddtdtueueuueddl
lrtudutdut0ddtdtuurtrdutsutluutdlddutueddtdtdtrrruultltlutdtut0u1dddtdtueueuueddl
lrtudutdut0ddtdtuurtrdutsutluutdlddutueddtdtdtrrruultltlutdtut0u1dddtdtueueuueddl
lrtudutdut0ddtdtuurtrdutsutluutdlddutueddtdtdtrrruultltlutdtut0u1dddtdtueueuueddl
lrtudutdut0ddtdtuurtrdutsutluutdlddutueddtdtdtrrruultltlutdtut0u1dddtdtueueuueddl
lrtudutdut0ddtdtuurtrdutsutluutdlddutueddtdtdtrrruultltlutdtut0u1dddtdtueueuueddl
lrtudutdut0ddtdtuurtrdutsutluutdlddutueddtdtdtrrruultltlutdtut0u1dddtdtueueuueddl
lrtudutdut0ddtdtuurtrdutsutluutdlddutueddtdtdtrrruultltlutdtut0u1dddtdtueueuueddl
lrtudutdut0ddtdtuurtrdutsutluutdlddutueddtdtdtrrruultltlutdtut0u1dddtdtueueuueddl
lrtudutdut0ddtdtuurtrdutsutluutdlddutueddtdtdtrrruultltlutdtut0u1dddtdtueueuueddl
lrtudutdut0ddtdtuurtrdutsutluutdlddutueddtdtdtrrruultltlutdtut0u1dddtdtueueuueddl
lrtudutdut0ddtdtuurtrdutsutluutdlddutueddtdtdtrrruultltlutdtut0u1dddtdtueueuueddl
lrtudutdut0ddtdtuurtrdutsutluutdlddutueddtdtdtrrruultltlutdtut0u1dddtdtueueuueddl
lrtudutdut0ddtdtuurtrdutsutluutdlddutueddtdtdtrrruultltlutdtut0u1dddtdtueueuueddl
lrtudutdut0ddtdtuurtrdutsutluutdlddutueddtdtdtrrruultltlutdtut0u1dddtdtueueuueddl
lrtudutdut0ddtdtuurtrdutsutluutdlddutueddtdtdtrrruultltlutdtut0u1dddtdtueueuueddl
lrtudutdut0ddtdtuurtrdutsutluutdlddutueddtdtdtrrruultltlutdtut0u1dddtdtueueuueddl
lrtudutdut0ddtdtuurtrdutsutluutdlddutueddtdtdtrrruultltlutdtut0u1dddtdtueueuueddl
lrtudutdut0ddtdtuurtrdutsutluutdlddutueddtdtdtrrruultltlutdtut0u1dddtdtueueuueddl
lrtudutdut0ddtdtuurtrdutsutluutdlddutueddtdtdtrrruultltlutdtut0u1dddtdtueueuueddl
lrtudutdut0ddtdtuurtrdutsutluutdlddutueddtdtdtrrruultltlutdtut0u1dddtdtueueuueddl
lrtudutdut0ddtdtuurtrdutsutluutdlddutueddtdtdtrrruultltlutdtut0u1dddtdtueueuueddl
lrtudutdut0ddtdtuurtrdutsutluutdlddutueddtdtdtrrruultltlutdtut0u1dddtdtueueuueddl
lrtudutdut0ddtdtuurtrdutsutluutdlddutueddtdtdtrrruultltlutdtut0u1dddtdtueueuueddl
lrtudutdut0ddtdtuurtrdutsutluutdlddutueddtdtdtrrruultltlutdtut0u1dddtdtueueuueddl
lrtudutdut0ddtdtuurtrdutsutluutdlddutueddtdtdtrrruultltlutdtut0u1dddtdtueueuueddl
lrtudutdut0ddtdtuurtrdutsutluutdlddutueddtdtdtrrruultltlutdtut0u1dddtdtueueuueddl
lrtudutdut0ddtdtuurtrdutsutluutdlddutueddtdtdtrrruultltlutdtut0u1dddtdtueueuueddl
lrtudutdut0ddtdtuurtrdutsutluutdlddutueddtdtdtrrruultltlutdtut0u1dddtdtueueuueddl
lrtudutdut0ddtdtuurtrdutsutluutdlddutueddtdtdtrrruultltlutdtut0u1dddtdtueueuueddl
lrtudutdut0ddtdtuurtrdutsutluutdlddutueddtdtdtrrruultltlutdtut0u1dddtdtueueuueddl
<---------------- 拆墙 ---------------->
dddlerererererererererererererererererererererererererererererererereuuuurere
<-------------------------- 去前导零 -------------------------->
<---------------- 补零 ---------------->
lllllllllllllllllllllllllllllllll0
<---------------- 去零 ---------------->
ersterstersterstersterstersterstersterst
ersterstersterstersterstersterstersterst
ersterstersterstersterstersterstersterst
<---------------- 归位 ---------------->
r

标签:删掉,uurlstdd0uurltleurlstddddut0uudtuurltledddedeul,题解,位置,当前,操作,Summation,CF1078E
来源: https://www.cnblogs.com/blueqwq/p/15815184.html