[CSP-S 2025] 员工招聘 / employ

对某位应聘者我们只关注其 \(c\) 的值,而并不在意其具体是谁,也就是 \(c\) 相同的人本质相同。令 \(cnt_j\) 表示 \(c_i=j\) 的数量,\(s_j\) 表示 \(c_i\le j\) 的数量。

解法一(贡献延迟计算)

先考虑一个很naive的 \(\mathrm{dp}\),直接令 \(f(i,j)\) 表示前 \(i\) 个空位,目前有 \(j\) 个应聘者失败的方案数,但是我们在分配 \(p_i\) 时如果钦定其成功,那么需要保证 \(c_{p_i}>j\),但是在排列中一个数只能用一次,在后续的转移中我们并不知道此时能用的 \(p_i\) 有多少个,很蠢的方法就是再记录具体有那些 \(p_i\) 用过,这样就要 \(f(i,j,S)\) 的状态,直接退化成指数级。

考虑贡献延迟计算。先来挖掘一下这个决策过程所蕴含的性质,不难发现从前往后决策时,决策基准 \(j\) 是单调(不降)的。贡献延迟计算的思想就是先『占位』再『派位』,即决策过程中,如果对某个位置存在特定约束,我们并不立刻为它指派具体元素,而是声明这里开辟了空位。随着dp的推进,受某种单调性(此题中为 \(j\) 的单调性)的影响,约束边界不断变得严格,某些元素的限制将要被突破,我们再通过组合数等手段集中一次性地将这些具体的元素填到空位里。形式化地,我们将当前所有元素划分成 \(\le j\) 和 \(>j\) 两个集合 \((S_0,S_1)\),转移时考察有哪些元素 \(S_0\to S_1\),在这个时候计算这些元素的贡献。

看看这个思想是如何运用在此题的 \(\mathrm{dp}\) 上。在决策过程中我们会钦定某些位置 \(c_{p_u}>j\),由贡献延迟计算的思想,我们额外记录此时“活跃空位”的数量为 \(k\),于是设计状态 \(f_{i,j,k}\) 表示考虑前 \(i\) 个空位,目前有 \(j\) 个应聘者失败,且当前有 \(k\) 个活跃空位时的方案数。这些位置被钦定 \(c_{p_u}>j\),但是我们还没有确定其具体的元素。在转移时,在 \(j\to j+1\) 的时候,所有 \(c_{p_u}>j\) 的约束变成了更严格的 \(c_{p_u}>j+1\),那么所有实际耐心值 \(c_{p_u}=j+1\) 的人他们必须立刻被分配到位置上,某些“活跃空位”在此时变成了确定的。

  • 钦定第 \(i+1\) 个人来面试。需要满足 \(c_{p_{i+1}}>j\)。

    • \(s_{i+1}=1\):此时第 \(i+1\) 个人被录取了,未录取人数 \(j\) 不变,没有发生空位跃迁,并且约束的数量变成了 \(k+1\),得到转移 \(f_{i+1,j,k+1}\leftarrow f_{i,j,k}\)。

    • \(s_{i+1}=0\):此时第 \(i+1\) 个人无法录取,未录取人数 \(j\to j+1\),因此空位中实际要填 \(c_{p_u}=j+1\) 的人现在需要考虑填入共 \(k+1\) 个空位中,枚举实际选择了 \(\ell(\ell\le cnt_{j+1})\) 个人,得到:

      \[f_{i+1,j+1,k+1-\ell}\leftarrow \binom{cnt_{j+1}}{\ell}\binom{k+1}{\ell}\ell!\times f_{i,j,k} \]

  • 钦定第 \(i+1\) 个人不来面试。需要满足 \(c_{p_{i+1}}\le j\)。

    注意到 \(c_{p_{i+1}}\le j\) 并不是可以延后计算的“活跃位置”,我们需要立刻在这里计算其填数方案数。满足 \(c_{u}\le j\) 的人总共有 \(s_j\) 个,由于前 \(i\) 个人中钦定了 \(k\) 个满足 \(c_{u}>j\),所以前 \(i\) 个人里面 \(c_u\le j\) 的恰好用掉了 \((i-k)\) 个人,因此这个位置可选的就有 \([s_j-(i-k)]\) 个人。同理转移到 \((j+1,k)\),需要枚举有 \(\ell\) 个位置被确定,得到转移:

    \[f_{i+1,j+1,k-\ell}\leftarrow [s_j-(i-k)]\binom{cnt_{j+1}}{\ell}\binom{k}{\ell}\ell!\times f_{i,j,k} \]

考虑最后答案的计算。在考虑完所有 \(n\) 个位置之后,一共有 \(j\) 个人被淘汰,注意到此时 \(c_{p_i}>j\) 的人还没有被分配,这些人总共有 \(n-s_j\) 个,需要恰好 \(n-s_j\) 个位置来安放这些元素,得到 \(ans=\sum\limits_j f_{n,j,n-s_j} (n-s_j)!\)。

解法二(容斥)

非常巧妙简洁的容斥。注意到我们的限制既有 \(c_i\le j\) 也有 \(c_i>j\),但是如果只有 \(c_i\le j\),这就是一个非常经典的排列计数,对于 \(P_i\le b_i\) 限制的排列计数,答案就是 \(\prod\limits_{i=1}^m (b_i-i+1)\),这显然是容易在dp中计算的。

考虑用容斥转化,考虑 \([c_i>j]=1-[c_i\le j]\)。这样我们直接将所有约束都转化成了 \(c_i\le j\) 的形式,令 \(f_{i,j,k}\) 表示考虑前 \(i\) 个位置,目前有 \(j\) 个人不被录取,且钦定了 \(k\) 个位置需要满足上界限制(或者被钦定为不合法),此时这 \(k\) 个被钦定的位置的填数方案数。

  • 若 \(s_{i+1}=0\),当前位置只能不合法,不做限制于是 \(f_{i+1,j+1,k}\leftarrow f_{i,j,k}\)。

  • 若 \(s_{i+1}=1\)

    • 钦定这个人不通过,于是钦定了 \(c_{p_i}\le j\),带入乘积式,系数就是 \(s_j-(k+1)+1=s_j-k\),于是转移为:\(f_{i+1,j+1,k+1}\leftarrow f_{i,j,k}\cdot (s_j-k)\)

    • 钦定这个人通过,于是钦定了 \([c_{p_i}>j]=1-[c_{p_i}\le j]\),用容斥拆成两部分:

      • 对于 \(1\) 的部分,相当于不钦定这个位置,得到 \(f_{i+1,j,k}\leftarrow f_{i,j,k}\)。

      • 对于 \(-[c_{p_i}\le j]\) 的部分,带上容斥系数 \(-1\) 即可:\(f_{i+1,j+1,k+1}\leftarrow -f_{i,j,k}\cdot (s_j-k)\)

考虑最终答案,由于我们定义的dp状态只考虑了钦定位置的方案数,剩下的位置可以随便填,得到 \(ans=\sum\limits_j\sum\limits_{k} f_{n,j,k}\cdot (n-k)!\)

posted @ 2025-11-17 20:54  STDJCY  阅读(123)  评论(0)    收藏  举报