其他分享
首页 > 其他分享> > ARC089D ColoringBalls 题解

ARC089D ColoringBalls 题解

作者:互联网

考虑最后哪些颜色序列可以被得到。

先将相邻的相同颜色缩起来。这不会影响可达性。接着,\(\texttt{w}\) 可以视作分隔符,因为其一定没有被染过色。

现在整个序列被分成了 \(m\) 个连续段,且连续段内部相邻的颜色不同。设第 \(i\) 个连续段有 \(c_i\) 个 \(\texttt{b}\),考虑如何操作得到该连续段。

以上读者自证不难。

那么 check 一个颜色序列能否被得到就很简单了:缩成连续段以后按 \(\texttt{b}\) 的数量从大到小排序,然后分配操作序列:先把最前面 \(m\) 个 \(\texttt{r}\) 依次给每个连续段都分配一个,然后将所有 \(c_i \ge 1\) 的连续段贪心地找到先前分配的 \(\texttt{r}\) 后第一个 \(\texttt{b}\) 并占用,最后将所有 \(c_i \ge 2\) 的连续段贪心地占用先前分配的 \(\texttt{b}\) 后前 \(c_i-1\) 个还没有被占用的操作。如果找不到,这个颜色序列就不合法。

但是,我们仍然不可能枚举所有的连续段的 \(c_i\)。不过,我们发现连续段的 \(c_i\) 的次序是无关紧要的,所以类似划分数那样爆搜,然后用多重集排列计算即可。注意到一个有 \(c_i\) 个 \(\texttt{b}\) 的连续段长度至少为 \([c_i=0]+[c_i \ge 1](2c_i-1)\),因此方案数较少,为划分数级别。

最后,由于我们现在计算的是缩完相同颜色后的方案,我们还需要将其扩展至长度为 \(n\)。令 \(f(x)\) 表示有 \(x\) 个 \(\texttt{b}\) 的连续段长度的最小值,即 \(f(x)=[x=0]+[x \ge 1](2x-1)\)。则现在已经填了 \(A=m-1+\sum_{i=1}^m f(c_i)\) 个位置(\(m-1\) 是因为相邻两个连续段之间至少有一个 \(\texttt{w}\)),剩下 \(n-A\) 个位置尚未分配颜色。

考虑将未分配颜色的位置插入空隙中。一个有 \(c_i\) 个 \(\texttt{b}\) 的连续段有 \(2c_i+1\) 个空隙,而相邻两个连续段之间也有 1 个空隙以插入 \(\texttt{w}\)。如图:

由于第 1 段前面还可以插入 \(\texttt{w}\),共 \(B=m+1+\sum_{i=1}^m (2c_i+1)\) 个空隙。用插板法将 \(n-A\) 个球分配到这些空隙中,方案数为:

\[\binom{n-A+B}{B-1} \]

于是就做完了。

标签:颜色,题解,texttt,ColoringBalls,ARC089D,ge,连续,序列,操作
来源: https://www.cnblogs.com/acceptedzhs/p/arc089d-sol.html