[Procedure #3] P8866 [NOIP2022] 喵了个喵

[Procedure #3] P8866 [NOIP2022] 喵了个喵

声名远扬臭名昭著的一道 ad-hoc。

[Start]

如果任何一种卡牌有奇数张必然无解。~~~~

如果一个栈里面有一个卡牌不是通过操作 1 来消除,那么必须通过操作二才能消除。

卡牌的种类数好像很神秘啊,如果种类数不大于 \(n\) 的话,显然很容易操作:各种颜色分开放即可

如果不是这样,我们再按照这种方式去放,有可能会遇到一个堆里面存在两种颜色的情况,但是由于种类数为 \(2n-1\),所以必然有一个只有一种,就是有一个柱子是 free 的……好像没什么用。试试 \(n=2\) 的情况,此时有 \(3\) 种卡牌。

我们可以看看这样的策略,把连续的一段消掉最后变成一个相邻的都不同色的一个序列,然后再来

[Failed] 没有下一个方向 [Hint]

[Hint] 确立一个基本策略

欸,对于刚刚的情况,我好像有一种策略,先变成刚刚这个相邻不同的序列,设三种颜色为 \(a,b,c\),最开始遇到的两种颜色,我们分别将其放在两个栈内,此时遇到第三种颜色,不妨设其为 \(c\),若下一个颜色是 \(x\),那么就把 \(c\) 放到另一个的顶端(设这个颜色为 \(y\)),然后把下一个 \(x\) 和这一个抵消,然后再下一个如果是 \(c\),就抵消原来的 \(c\),如果是 \(y\) 就抵消,这样,只剩一个数了,我们重复这个策略即可。

很对啊!

而且我们消除之后,每一个显然都还是出现了偶数次,否则就说明原先就不行。

[Check Point 1]

我们可以再想想能不能拓展到 3 个牌栈的情况。

好像很难,我们先考虑一下 \(k=2n-2\),毕竟这个 \(k\) 很特殊。

成了,我们只要沿用上面的方法,我们一直留一个空位置不填,然后其他的填两层,就可保证来一个数就删一个。

[Check Point 2]

那么,\(2n-1\) 呢?如果是这样,留着一个空位置就会导致多出一个,就会放 3 个,从而有一个就不能被操作到。

如果只是直接把多的一个放在空位置上,一旦下一个给出了一个在下层的数,就无法达到我的目标。

总之我只有 \(2n-2\) 个可消除的数,这一部分必然有一个数没办法删除。考虑能不能用一种手段,一直转换那个不能删除的数,使得其能够删除。

我们结合 [Check Point 1] 的内容,只要有 2 个空位,我们就能执行任何三个的消除任务,其实即使没法执行二操作,我们可以在别的地方运行 [Check Point 1] 的方法,

[Replay]

说实话,我觉得应该少出这种题,我 [Check Point 1] 的内容其实就是把题解的策略旋转了 90 度,我是先横着填的,没有特意去保留一个特殊栈,竖着想就容易得多了,这就叫脑电波吗?奋斗两小时,就拿 35,\(n=3\) 的情况究竟是给谁得的?

Thoughts Memo

值得反思的是,[Check Point 1] 的策略其实过于复杂了,没有推广性,做这类题目的时候应该注意策略的简洁性,否则是难于扩展的。

posted @ 2025-08-19 21:43  haozexu  阅读(13)  评论(0)    收藏  举报