🍕🏠🌋 当前时间是:

 

CF1437F

好神奇的 dp 题。

description

给定数组 \(a\),求其有多少个排列满足

  • \(y_i=\max(a_1,a_2,\dots,a_{i-1})\)

  • \(\forall i\in [1,n]\cap\mathbb{Z},2a_i\leq y_i ~\texttt{OR}~ 2y_i\leq a_i\)

以下标区分排列。

solution

我们称一个排列中所有满足 \(2y_i\leq a_i\)\(i\) 为关键点。

\(a\) 数组排序,记 \(s_i\) 表示 \(a\) 数组中 \(\leq \lfloor\dfrac{a_i}{2}\rfloor\) 的数的个数加 1。

\(f_i\) 表示考虑前 \(i\) 个数,第 \(i\) 个数是关键点且所有 \(\leq \lfloor\dfrac{a_i}{2}\rfloor\) 的数与 \(a_i\) 本身都已经填好的方案数。

如果 \(2\times a_{n-1}>a_n\),答案为 0;否则,根据状态定义,答案为 \(f_n\)

这是本题状态设计很有意思的一点,状态本身不能表示所有情况的答案,但是我们可以直接回答其不能表示的情况的答案。

下面来转移:

  • \(f_0=1\)

  • \(f_i=\sum\limits_{j=0,a_j\times2\leq a_i} A_{n-s_{a_j}-1}^{s_{a_i}-s_{a_j}-1}f_j\)

考虑第二个转移式的意义。

我们枚举上一个关键点 \(j\),那么根据状态定义,当前还有 \(n-s_{a_j}\) 个位置,又因为 \(a_i\) 一定放在 \(a_j\) 后第一个没有填的位置(否则该位置不能填其他合法的数),所以还有 \(n-s_{a_j}-1\) 个位置不确定,我们要把 \(>\lfloor\dfrac{a_j}{2}\rfloor\)\(\leq \lfloor\dfrac{a_i}{2}\rfloor\) 的除了 \(a_j\)\(s_{a_i}-s_{a_j}-1\) 个数填进去排列。(可以发现,所有空位一定在 \(a_i\) 后边,所以可以放心地把这些数填进去)

特别地,\(j=0\) 时,系数为 \(A_{n-1}^{s_{a_i}-1}\) 正好也符合上述转移式。


感觉这个 dp 特别神奇,因为从正面去想总感觉哪里不对,但是仔细思考却可以发现其正确性。

code

Submission #228269315 - Codeforces

posted @ 2023-10-20 11:26  zzafanti  阅读(33)  评论(1)    收藏  举报
浏览器标题切换
浏览器标题切换end