题解:P12649 [KOI 2024 Round 2] 收集彩球

· · 题解

本篇题解提供一种学数据结构学傻了的数据结构模拟贪心策略解法。又臭又长,不如图论解法与证法。

首先手玩几个样例,发现要使得两个同色球能在操作后放在一个桶中,操作前这两个球必须均位于不同的桶的顶端。

当有两个同色球位于不同桶顶端时,存在以下几种操作:

1. 两个球,均在桶的上方位置,此时需要有一个空桶才能使得两个球放到同一个桶当中,操作次数为 2。

2. 两个球,一个在桶的上方位置,一个在桶的下方位置,此时把在一号位置的球放在位于二号位置的球的桶中,操作次数为 1。

3. 两个球,均在桶的下方位置,此时可以把两个球放到同一个桶当中,然后得到一个空桶,操作次数为 1。

然后考虑并分讨一下是否存在空桶的情况:

但是会存在球都被错开的情况,此时三种操作均无法进行,且一种颜色的球只会在顶端出现一次,如:桶一从上到下存颜色为 1,为 2 的球,桶二从上到下存颜色为 2,为 1 的球,此时只有存在空桶才能继续操作下去,可以把一个位于桶的上方的球放到空桶当中,然后进行上方的操作,如果还是无法进行,则说明无解,因为我们这种操作本质上是使得两个球满足在 2 操作的情况,如果操作完之后仍不能操作,则无解。

考虑证明:

对于给出初始状态当中下方的一个球,当且仅当上方没有球,并且有另一个在顶端的球时,能进行匹配,对于这种状态,我们可以用 1 操作来创作出一种两个球均在桶的上方的局面,在进行过若干次 2 操作后,由一个 3 操作来结尾,因为每个球只出现两次,所以每种颜色的球只会产生两个桶的对应关系,即本次与下次操作的桶,当我们最后剩余两个同色球在不同桶时,我们会进行一次 3 操作,使得形成一个新的有若干球匹配完成的状态。

排除掉已经匹配完成的球,就到了一个新的初始状态,我们可以继续使用 1 操作来创造出进行 2 操作与 3 操作的局面,直至所有球被匹配完成为止。

而当其产生所有球被错开的情况,相当于我们进行一次把上方的球取出的时候,我们可以借助一个空桶移开一个元素,使得其到达可进行 2 操作的情况,并一直进行 2 操作直至所有球被匹配完成为止,也会形成一个新的有若干球匹配完成的状态。

考虑无解的情况,此时产生了多个 1 操作或对应到了一连串 2 操作上,又或是无法进行 1 操作,而同色球在不同桶中而不是一对一错开的情况,因为第一步的操作(包含两种情况)需要空桶的支持,这两种情况下只有一个空桶无法满足需求,所以无解。

因此每次选择只与进行 1 操作来进行匹配并已 3 操作作为结尾或是选择错开的情况进行匹配有关,并且每次进行完会形成新的子状态,并形成独立问题,因此策略正确。

发现需要维护一种数据结构来维护球有多少在最顶端,支持查询全局最大值,单点修改,并且需要维护不同情况下的策略,这里我采用了线段树。

整体复杂度 O(n\log n)

代码实现丑,较上方描述略为复杂,慎看。

代码