Bankomat
显然越前面越优。由于模式串很短,所以可以记录每个位置后面 \(0\sim 9\) 最近的位置来优化匹配的过程。枚举所有四位数然后判断就行。
Points
Toy cars
当地上玩具太多时,和这道题一模一样地,扔掉接下来最晚需求的那个玩具。
用堆维护即可,注意每搞定一次需求,要再次丢入堆,更新该玩具下一次的需求。为啥不用删除呢?因为至少新丢入的晚于原先的,原先的不可能再被取到。
Piggy banks
从钥匙所在存钱罐向当前存钱罐连边,千万别想成拓扑了,这可是有环的,且连通块均为基环树(点数等于边数)。
但这个环非常美妙,首先它是循环的,即环上点可以互相到达,否则就会出现一个存钱罐存在两把钥匙的不合法情况。
那么剩下边的定向我们也是可以知道的,从环上每个点向其子树弄下去,所以环上任意一个点均可到达其余所有点,那么答案就是联通块个数了。
Knights
A Journey to Mars
首先不能走回头路,那么就只有两种旅行方式。为了方便不考虑环,反正是一样的。假设从 \(1\) 开始向 \(n\) 方向走,那么经过路 \(i-1\to i\) 的贡献为 \(p_i-d_i\)。搞出它的前缀和数组 \(pre\),对于一个起点 \(i\),如果存在 \(j\) 使得 \(pre_j-pre_i<0\) 则不合法,移项变成 \(pre_j<pre_i\),可以用线段树轻松维护。但没有修改操作,所以单调队列即可解决。
Bank notes
多重背包裸题,二进制拆分。
咋出现垃圾题了
Sumy Fibonacciego
全网首发中文正解。要知道抄袭波兰题解是非常艰难的一件事情
表示的存在性
考虑数学归纳法,假设 \(1\sim i(1\leq i\leq m,2\leq m)\) 位能表示 \(0\sim Fib_{i+1}-1\),显然在 \(1\) 和 \(2\) 的时候均成立。
因为 \(1\sim m-1\) 位能表示 \(1\sim Fib_m-1\),如果隔了 \(m\) 这一位的 \(0\),加上了 \(m+1\) 这个 \(1\) 的话,一定合法。这样可以表示出 \(Fib_0\sim Fib_m-1+Fib_{m+1}=Fib_{m+2}-1\)。
表示的唯一性
同样考虑数学归纳法,不妨找到两个表示最高的不同位。对于该位为 \(0\) 的那个表示,令其更低位取到最大;对于该位为 \(1\) 的那个表示,令其更低位取到最小:
\[10000\ldots 00(0)\\01010\ldots 10(1) \]将前者的 \(1\) 分解成后两位的两个 \(1\):
\[01100\ldots 00(0)\\01010\ldots 10(1) \]跳过前两位,形式不变,位数减少。显然在只剩三位和两位时均成立。
equation 的证明一概跳过。
一些特殊性质:
- 直接相加后 \(2\) 两侧只能是 \(0\)。
- 斐波那契数列是给定开始两项的。
先来考虑暴力,每次加入一位,然后维护。如果出现了 \(2\),就利用 \(\ref 1\) 和 \(\ref 2\) 不断往低位移。其中 \(\ref 2\) 会直接消掉 \(2\) 但可能出现 \(11\)。
移到最低位时可以利用 \(\ref 3\) 来搞掉。如果移到第二低位,此时末尾是 \(0020\) 这样,直接搞成 \(0101\)。
\[\begin{equation} X0210Y_{Fib}=X1100Y_{Fib}\label 6 \end{equation}\] \[\begin{equation} X0211Y_{Fib}=X1101Y_{Fib}\label 7 \end{equation}\]接下来要去掉连续的 \(1\),利用 \(\ref 4\) 和 \(\ref 5\) 可以搞掉。于是我们有了一个 \(O(n^2)\) 的做法。
如果一次性加完所有位,可能会出现一堆 \(2\)。
从低位往高位扫,同样利用 \(\ref 4\) 和 \(\ref 5\) 去掉连续的 \(1\),但这样会产生 \(21\) 这种副效果。利用 \(\ref 6\) 可以搞掉。
诶又出现了 \(211\) 这种副效果,不过别怕,利用 \(\ref 7\) 可以搞掉。最后的效果就是所有 \(1\) 和 \(2\) 均被 \(0\) 隔开。
\[\begin{equation} X201Y_{Fib}=X112Y_{Fib}\label 8 \end{equation}\] \[\begin{equation} X200Y_{Fib}=X111Y_{Fib}\label 9 \end{equation}\]紧接着,我们从高位往低位扫,利用 \(\ref 8\) 和 \(\ref 9\) 把 \(2\) 往低位移。
然后利用 \(\ref 8\) 去掉末尾是 \(20\) 的情况。
此时容易发现 \(\ref 9\) 会产生 \(1112\) 这种副效果,不过不用着急,因为锅还会更大,因为你发现了 \(202\) 无法处理。
先不管,理一理做完这步后整个表示的性质:
- 可能存在 \(202\)。
- 可能存在 \(2011\),比如说 \(20201\to 20112\) 或 \(20200\to 20111\)。但末尾不可能是 \(201\)。
- 不存在 \(2010\)。
- 不存在 \(200\)。
- 可能存在 \(11\) 或 \(12\),但不可能存在 \(21\) 或 \(22\)。
然后我们想要最后两位不存在 \(2\),所以一种情况利用 \(\ref 3\)。
\[\begin{equation} X20_{Fib}=X12_{Fib}\label{10} \end{equation}\] \[\begin{equation} X0\underbrace{11\ldots 11}_{2l}2_{Fib}={X\underbrace{10\ldots 10}_{2l+2}}{}_{Fib}\label{11} \end{equation}\] \[\begin{equation} X0\underbrace{11\ldots 11}_{2l+1}2_{Fib}=X\underbrace{10\ldots 10}_{2l+2}1_{Fib}\label{12} \end{equation}\]另一种情况利用 \(\ref 10\),然后利用 \(\ref 11\) 和 \(\ref 12\) 消去 \(2\) 前面紧跟着的 \(1\)。
- 上面前四条性质显然不会被破坏。
- 可能出现副效果 \(210\)。
从低位往高位扫,\(2\) 只会被推到前面。
仔细研究一下会发现所有情况都考虑进去了,之前做的工作没有白费,下面具体阐述一下:
- \(020\),因为不存在 \(200\) 和 \(2010\),且末尾不是 \(201\),所以按照上面处理肯定不会存在。
- \(202\),后面这个 \(2\) 会被消掉,直接没有了。
- \(120\),\(1200\) 不存在,\(12011\) 被搞掉,\(12010\) 不存在。也不可能在末尾处出现特殊情况。
最后再做一遍第一步(可以简化因为没有 \(2\) 了)把所有 \(1\) 隔开。
恭喜你做出了一道人类智慧神题,你品,你细品。
2021.4.4 update:
有了简单多的方法。
考虑倒着扫,优先处理进位,进不了位再考虑 \(\ref 2\),特判一下末尾。这样能够消去所有的 \(2\),最后把所有 \(1\) 隔开。正确性需要讨论各种情况。