ARC089D - ColoringBalls
ARC089D - ColoringBalls
题目大意
有一排 \(n\) 个球,一开始都是白色的。
然后有 \(m\)
次操作,用一个字符串表示,若第 \(i\)
个字符为r/b
则表示可以选择一段区间染成 红色/蓝色。
不能直接把一个白球染成蓝色。
求最终不同的球染色情况的个数 \(\mod 10^9+7\) 。
分析
下文视 \(n,m\) 同 阶。
分析最终态,总可以描述为若干连续的红蓝段,中间由白色分开。
如果确定了每一个红蓝段的长度和交错情况,然后再在 \(n\) 个位置里分配就能得到方案数,因此可以先忽略每一段的长度来进行考虑。
对于每一个红蓝段,可以分成两类:
只出现了红色,称这样的段为单一段。
出现了蓝色,不一定出现红色,称这样的段为复合段。
考虑这样的段如何构造得到:
- 先染了一次红色
- 然后染了一次蓝色
- 接下来的每一次操作,无论染红色还是蓝色,均可以使得交替次数 \(+2\) 。
而最终得到的段,交替段的两端的红色段可以为空。
为了包含到所有情况,并且不算重,构造方案时必然需要贪心地考虑。
可以先枚举有 \(a\) 个复合段, \(b\) 个单一段。
贪心地将前 \(a+b\) 个 r
操作用以新建一个段, \(a\)
个复合段对应着前 \(a\) 个
r
。
然后再为每一个复合段贪心地匹配后面的第一个 b
操作,记作
\((pos_i,match_i),i\in[1,a]\) 。
那么对于剩下的 r/b
,每一个操作均可以对于 \(a\)
个中的某一些进行,称这样的r/b
为自由的。
对于每一个自由的b
,设其位置为 \(j\) ,其能操作的段 \((pos_i,match_i)\) 必然满足 \(pos_i<j\) 。
对于每一个自由的r
,设其位置为 \(j\) ,其能操作的段 \((pos_i,match_i)\) 必然满足 \(match_i<j\) 。
对于 \(a\) 个复合段,容易求得它们各自能得到的自由操作数量,记作 \(c_i\) ,显然 \(c_i\ge c_{i+1}\) 。
设每一个段被操作了 \(b_i\) 次,满足条件的方案只需要满足 \(c_i\ge \sum_{j=i} b_j\) 。
而我们只需考虑 \(b_i\ge b_{i+1}\) 的方案,因为这样的方案更容易被满足。
其次还需要考虑这 \(a+b\) 个段之间的相对顺序:
- \(b\) 个单一段等价,无顺序;
- \(a\) 个复合段根据 \(b_i\) 分类, \(b_i\) 相同的段之间等价,需要在方案中除掉个数的阶乘。
- 最终还需要将 \(a,b\) 两部分归并。
考虑倒着处理 \(dp_{i,j,k}\) 表示考虑了 \([i,a]\) 这些复合段, \(b_i=j\) , \(\sum_{l=j} b_l=k\) 。
每次枚举一个 \(b_i\) 相同的段进行转移,即 \[ dp_{i,j,k}\leftarrow \sum_{d=1} \frac{1}{d!}\sum_{l=0}^{j-1} dp_{i+d,l,k+jd} \cdot [\ \forall p\in[0,d), k-jp\leq c_{i+p}] \] 可以在 \(j\) 这一维上前缀和优化,剩余的部分转移复杂度的一个上界为 \(O(n^3\ln n)\) 。
最终还需要将 \(a,b\) 两部分归并,并且将 \(n\) 个位置分配到每一个段中。
如果最终的方案额外加入了 \(i\) 个自由操作,则每一个段可以两类。
- 可以为空的段:
- 每一个复合段两端的红色段;
- 序列两端的白色段。
- 不能为空的段:
- 每一个复合段中间的段;
- 每一个单一段;
- 每一个交替段之间的白色段。
这是一个简单的插板问题,可以用组合数在 \(O(1)\) 时间求解。
而需要枚举 \(O(n^2)\) 个 \(a,b\) ,每次需要 \(O(n^3\ln n)\) 的 \(\text{dp}\) ,故总复杂度为 \(O(n^5\ln n)\) 。
实际上这个上界非常松,可以随意通过。
1 |
|