专栏文章

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

CF2066D2题解参与者 3已保存评论 3

文章操作

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

当前评论
3 条
当前快照
1 份
快照标识符
@minmqxkj
此快照首次捕获于
2025/12/02 04:57
3 个月前
此快照最后确认于
2025/12/02 04:57
3 个月前
查看原文
一道比较神奇的计数题。
我们经过适当转化后的题意可以变为:
在一个序列 aa 中填数,有些位置已经填好了,填完数后的 aa 要满足以下条件:
  1. 对于任意 i[1,n]i \in [1, n],满足 ajia_j \geq ijj 数量要不少于 cc
  2. 对于任意 i[1,m]i \in [1, m],满足 ajai,j<ia_j \geq a_i, j < ijj 的数量要小于 cc
不难发现,条件 11 可以写成满足 aj=na_j = njj 的数量恰好为 cc(同时结合了条件 22)。
对于这一类问题,我们考虑直方图 DP 的类似处理方式,对于每一个 i[1,n]i \in [1, n] 考虑 aa 序列最终填完之后 ajia_j \geq i 的位置和 aj=ia_j = i 的位置来进行 DP。

Solution for easy version(ai=0a_i = 0

直接考虑上面的过程,定义 fi,jf_{i, j} 表示考虑到第 ii 层,apia_p \geq i 的位置 ppjj 个。考虑在 jj 个位置中选出若干位置 pp 满足 ap=ia_p = i,稍微分析一下性质就可以知道,在这 jj 个位置中,只有前 cc 个位置才可以放 =i=i 的元素,因此有以下显然的 DP:
  • f1,m=1f_{1, m} = 1
  • 枚举 kk 表示满足 ap=ia_p = ipp 的数量,有:fi,j×(ck)ai+1,jkf_{i, j} \times \binom{c}{k} \rightarrow a_{i + 1,j - k}
  • 答案是 fn,cf_{n, c}
时间复杂度为 O(nmc)O(nmc)代码 1

Solution for hard version

考虑上面的 DP 思路能否继续使用,我们发现如果依旧使用上面的记录方式 fi,jf_{i,j},在前 cc 个位置中我们不知道存在多少个位置满足不能填 ii,于是这个 DP 就假了。
我们能否记录一些本质相同但是和位置相关的信息呢?显然这是可以的,我们魔改一下 DP 数组,记录 fi,jf_{i, j} 表示考虑 apia_p \leq i 的所有位置以后第 cc>i>i 的位置是 jj,这样我们得到的信息量就很大了!首先,所有 ap=i+1a_p = i + 1 的位置 pp 只能在 jj 之前填;其次,jj 之前的空位数量恰好为 cc;同时,在填完 i+1i + 1jj 的新位置就是 j+tj + ttt 表示填 i+1i + 1 的数量。因此,我们可以进行 DP:
  • f0,c=1f_{0, c} = 1
  • 定义 xx 为所有已经强制填的 ap=i+1a_p = i + 1 的数量,zz 为所有 pjp \leq j 并且已经强制填的 ap>i+1a_p > i + 1 的数量,要求不存在强制填的 ap=i+1,p>ja_p = i + 1, p > j,有转移:fi,j×(cxzy)fi+1,j+x+y,y[0,cxz]f_{i, j} \times \binom{c - x - z}{y} \to f_{i+1, j + x + y}, y \in [0, c - x - z]
  • 答案为 fn1,mf_{n-1, m}
这个东西有点抽象,我大概想了 40min 才会,可以画图理解一下,时间复杂度为 O(nmk)O(nmk)代码 2

评论

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

正在加载评论...