创新题好玩爱玩

· · 题解

直接按题目顺序排了。

关于【阶段】的定义:每两个断点之间为一个阶段。

难度分级(可能有个人差):

教程关:熟悉了本题的题面就可以轻松解决的。

简单:我秒掉或者没想多久的。

中等:我经过一番思考能做出来的。

困难:我想不到,看了解析才会的。

1

教程关。可以用来熟悉规则。

直接放会死循环,考虑怎么样不会死循环,自然是找字符过渡。

一阶段:把 \texttt{abc} 分别换成 \texttt{def}

二阶段:把 \texttt{def} 换回 \texttt{abc},放到目标盒子。

8
change 0 a 0 d
change 0 b 0 e
change 0 c 0 f
#
change 0 d 1 a
change 0 e 2 b
change 0 f 3 c
#

2

依旧是教程关。

同理,用 \texttt{def} 进行过渡,换的时候放回原来的盒子,改一下字符就好了。

8
change 0 a 0 d
change 0 b 0 e
change 0 c 0 f
#
change 0 d 0 b
change 0 e 0 c
change 0 f 0 a
#

3

最后一个教程关。

有了前面的经验,我们发现找字符过渡是很好用的技巧。

不含 \texttt{a} 的清掉,那把含 \texttt{a} 的过渡掉不就可以了?

所以把 \texttt{ab}\texttt{ac} 过渡掉,清完 \texttt{b}\texttt{c} 再换回来就可以了。

8
change 0 ab 0 ae
change 0 ac 0 af
change 0 b 0 @
change 0 c 0 @
#
change 0 e 0 b
change 0 f 0 c
#

4

本题正式开始。

难度:简单。

可以沿用 3 的方法,把含 \texttt{a}\texttt{b}\texttt{c}\texttt{ef} 过渡掉,然后找 \texttt{b}\texttt{c} 放进去 \texttt{a}。要用一下开头断点的特性,这样保证了只放一次。

8
change 0 ab 0 ae
change 0 ac 0 af
change 0 b 0 ab
change 0 c 0 ac
#
change 0 e 0 b
change 0 f 0 c
#

5

难度:中等。

```plain 44 change 0 a 1 x change 0 b 1 y change 0 c 1 z change 1 xx 6 de change 1 xy 6 dj change 1 xz 6 dp change 1 yy 6 ij change 1 yz 6 ip change 1 zz 6 op change 2 xx 6 ef change 2 xy 6 ek change 2 xz 6 eq change 2 yy 6 jk change 2 yz 6 jq change 2 zz 6 pq change 3 xx 6 fg change 3 xy 6 fl change 3 xz 6 fr change 3 yy 6 kl change 3 yz 6 kr change 3 zz 6 qr change 4 xx 5 gx change 4 xy 5 gy change 4 xz 5 gz change 4 yy 5 ly change 4 yz 5 lz change 4 zz 5 rz change 0 d 1 x change 0 e 2 x change 0 f 3 x change 0 g 4 x change 0 i 1 y change 0 j 2 y change 0 k 3 y change 0 l 4 y change 0 o 1 z change 0 p 2 z change 0 q 3 z change 0 r 4 z # change 0 x 0 a change 0 y 0 b change 0 z 0 c # ``` $6$ 分做法:前面的做法过于繁琐。考虑用一个 $\texttt{m}$ 字符,称作【后移标记】,表示向后移动当前最大的一个字符,那么当找到两个字符的时候加入一个后移标记就可以了。 ```plain 26 change 0 a 1 x change 0 b 1 y change 0 c 1 z change 4 mz 5 z change 3 mz 4 z change 2 mz 3 z change 1 mz 2 z change 4 my 5 y change 3 my 4 y change 2 my 3 y change 1 my 2 y change 4 mx 5 x change 3 mx 4 x change 2 mx 3 x change 1 mx 2 x change 0 zz 0 zzm change 0 yz 0 yzm change 0 xz 0 xzm change 0 yy 0 yym change 0 xy 0 xym change 0 xx 0 xxm # change 0 x 0 a change 0 y 0 b change 0 z 0 c # ``` 满分做法:容易发现,一堆不同字符是主要开销。所以考虑把 $\texttt{abc}$ 压成 $36,6,1$ 个同一字符。找到 $\texttt{a}$ 的时候加 $36 \times 4 = 144$ 个【后移标记】,找到 $\texttt{b}$ 的时候加 $24$ 个,找到 $\texttt{c}$ 的时候加 $4$ 个,用【后移标记】暴力后移压成的字符就可以了。最后要把标记清掉。 ```plain 13 change 0 a 1 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx change 0 b 1 xxxxxx change 0 c 1 x # change 4 mx 5 x change 3 mx 4 x change 2 mx 3 x change 1 mx 2 x change 0 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 0 ammmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm change 0 xxxxxx 0 bmmmmmmmmmmmmmmmmmmmmmmmm change 0 x 0 cmmmm change 0 m 0 @ # ``` ### 6 难度:简单。 直接用类似摩尔投票的方法做。先消 $\texttt{abc}$ 让每个盒子里只剩两种球,然后消 $\texttt{ab}$、$\texttt{ac}$、$\texttt{bc}$、$\texttt{aa}$、$\texttt{bb}$、$\texttt{cc}$。 ```plain 8 change 0 abc 0 @ change 0 ab 0 @ change 0 ac 0 @ change 0 bc 0 @ change 0 aa 0 a change 0 bb 0 b change 0 cc 0 c # ``` ### 7 难度:困难。 不太能沿用 $6$ 的做法。继续考虑用字符过渡。不妨把 $\texttt{ab}$、$\texttt{ac}$、$\texttt{bc}$ 分别压成 $\texttt{def}$,然后如果存在 $\texttt{bd}$、$\texttt{ce}$、$\texttt{cf}$ 说明两个字符中大的字符较多,把 $\texttt{def}$ 替换成大的字符。否则就是小的多,替换成小的字符。 ```plain 10 change 0 ab 0 d change 0 bd 0 bb change 0 d 0 a change 0 ac 0 e change 0 ce 0 cc change 0 e 0 a change 0 bc 0 f change 0 cf 0 cc change 0 f 0 b # ``` ### 8 难度:中等。 $9$ 分做法:手算出每个字符对每一位的贡献,用五个字符分别表示对五位的贡献,直接移动即可。 ```plain 10 change 0 a 6 defgh change 0 b 6 deefffgggghhhhh change 0 c 6 deeeefffffffffgggggggggggggggghhhhhhhhhhhhhhhhhhhhhhhhh # change 0 d 1 a change 0 e 2 a change 0 f 3 a change 0 g 4 a change 0 h 5 a # ``` 满分做法:发现 $n=1$,所以可以选一个盒子不打标记,直接把 $\texttt{a}$ 加进去。 ```plain 9 change 1 a 2 dafgh change 1 b 2 daafffgggghhhhh change 1 c 2 daaaafffffffffgggggggggggggggghhhhhhhhhhhhhhhhhhhhhhhhh # change 0 d 1 a change 0 f 3 a change 0 g 4 a change 0 h 5 a # ``` ### 9 难度:极度困难。 其实核心思想很简单,但是要加一车优化导致不可读了(根据剪贴板,出题人似乎都没法详细解释每一个优化),我写一个我的大致理解抛砖引玉吧。 思想源于一个性质:$\texttt{c}$ 无需比较,以 $\texttt{a}$ 的数量为第一关键字,$\texttt{b}$ 的数量为第二关键字进行排序就可以得到字符串的顺序。 于是可以把 $\texttt{a}$ 压成 $max+1$ 个字符 $\texttt{o}$,$\texttt{b}$ 压成 $1$ 个字符 $\texttt{o}$,比较 $\texttt{o}$ 的个数。 [std](https://www.luogu.me/paste/57zgqvpt) 的实现大概是,首先,用 $\texttt{r}$ 来使每个盒子都被处理到,不妨称为【苏醒标记】。因为最多只会有 $4$ 个盒子没有 $\texttt{aa}$ 或 $\texttt{bc}$,所以给有这两个字符串的盒子加上【苏醒标记】,然后传给其他盒子,使得每一个盒子的字符都被转化成 $\texttt{o}$。 接下来,把 $\texttt{r}$ 回收利用处理排名。研究了一下,大致逻辑是用 $\texttt{s}$ 维护排名,根据 $\texttt{o}$ 保留 $\texttt{r}$,用 $\texttt{v}$ 过渡,$\texttt{o}$ 越多,保留的 $\texttt{r}$ 越多,消掉的 $\texttt{s}$ 就越多,消掉的 $\texttt{s}$ 越多排名就越靠前。 对于一份加了大量抽象优化的代码进行详细分析还是困难的,大概也就只能分析到这里了,如果有我理解错的欢迎指出。 ### 10 难度:困难。 要用到不少技巧。 首先,字符串长度有限制,沿用 $5$ 的进制压位不太能做,看起来要适当利用断点。 然后就是非常神仙的思路:把 $\texttt{b}$ 和 $\texttt{c}$ 分别压成 $n \cdot max+1$ 和 $n \cdot max+2$ 个 $\texttt{a}$,再用一个 $\texttt{t}$ 标记表示往后一位传 $a$,根据开头的断点适当调整顺序就可以通过了。 ```plain 15 change 5 t 5 @ change 4 t 5 a change 3 t 4 a change 2 t 3 a change 1 t 2 a change 0 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 0 c change 0 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 0 b change 0 a 0 tx change 0 b 0 ttttttttttttttttttttttttttttttttttttttttttttttttttty change 0 c 0 ttttttttttttttttttttttttttttttttttttttttttttttttttttz # change 0 x 0 a change 0 y 0 b change 0 z 0 c # ```