专栏文章

题解:CF2066D2 Club of Young Aircraft Builders (hard version)

CF2066D2题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minih2q5
此快照首次捕获于
2025/12/02 02:57
3 个月前
此快照最后确认于
2025/12/02 02:57
3 个月前
查看原文

题解

对于计数题考虑找充要条件。考虑一个数字能填需要满足其前面还没有 cc 个数大于它,注意这个限制是后缀的,所以我们考虑值域的前缀。对于 1 我们只能放在 [1,c][1,c],以此类推,我们能够得到 ii 能够放置的区间 [1,c+j<icntj][1,c+\sum\limits_{j<i}\text{cnt}_j],其中 cntj\text{cnt}_jjj 的数量。于是我们可以对其考虑 dp,设 fi,jf_{i,j} 表示考虑到 ii 填了 jj 个数的方案数。转移考虑枚举 ii 放了多少个,设为 kk,其上界是 min(j,c)\min(j,c)。此时我们能够知道 ii 填数范围是 [1,c+jk][1,c+j-k],首先我们需要判断这个上界是否合法,因为可能存在已经给出的 ii 的最右边不在区间内的情况。判断转移合法性之后就简单了,现在只需考虑填数的方案数即可。因为之前已经有 jkj-k 个数,于是还剩下 cc 个空位,但是考虑到原来的序列本身还有一些数已经确定,于是还要减去这段前缀区间内 i\ge i 的数的个数,设为 ss。考虑我们需要将 kkii 放进去,但是可能原来序列中也有一些 ii 了,其数量设为 tt,那么我们的方案数就是 (cskt)c-s\choose k-t。于是最后的 dp 式子就是:
fi,j=kmin(c,j)fi1,jk×(cskt)f_{i,j}=\sum_{k\le\min(c,j)}f_{i-1,j-k}\times{c-s\choose k-t}
时间复杂度 O(nmc)\mathcal O(nmc)

评论

0 条评论,欢迎与作者交流。

正在加载评论...