ABC 431 F
F - Almost Sorted 2
原数组并不重要,可以先预处理出所有元素的桶。
要求的是原数组重排后的可行序列数量,我们不妨考虑插入每种元素,用乘法原理累计每次插入的方案数,即为最终答案。
不妨按照从小到大的顺序依次插入每种数,那么在插入元素 \(v\) 时,所有 \(< v\) 的元素已经在当前序列中。
考虑序列需要满足的条件:\(\forall i \in [1,n-1], B_{i+1} \geq B_{i} - D\)。对于这个限制条件,由于 \(D>0\) 且是按照升序插入数字的,我们需要注意到:考虑一个数是否可以插入到某个位置,只需要考虑这个位置后面的一个数就行了,而前面的数不会对其造成影响。考虑 \(v\) 可以插入到当前序列中的哪些位置:显然,只能插入到值 \(\geq v - D\) 的元素之前或者末尾,而这些位置的数量是可以利用前缀和 \(O(1)\) 算出来的,并且我们可能有多个元素 \(v\) 插入(假设共有 \(cnt_{v}\) 个 \(v\))。可插入位置的数量为:
\[y =(\sum_{i=v-D}^{v-1} cnt_{i}) + 1
\]
(后面的 \(+1\) 是因为末尾位置一定是可插入的)
那么其实,插入的情形可以看作:在 \(y\) 个位置中插入 \(cnt_{v}\) 个相同的 \(v\)。根据隔板法,不难发现这个情形等价于:用隔板将 \(x = cnt_{v}\) 个小球(对应每个元素 \(v\))分成 \(y\) 份(对应每个位置),每一份可空,方案数。即为:\(C_{x+y-1}^{y-1}\),代入得到方案数为:
\[C_{(\sum_{i=v-D}^{v}cnt_{i})}^{cnt_{v}}
\]
模拟每种数的插入,并用乘法原理累计每次插入的方案数即可。

浙公网安备 33010602011771号