Loading

题解 [IOI 2024 集训队互测 Day5] 栞

题意

给定正整数 \(k\)。对于一个 \(1,2,\dots,n\) 的排列 \(p\),定义 \(f(p)\) 是以下操作能够得到的字典序最小的排列:

  • \(p\) 划分为恰好 \(k\) 个非空连续段,将每个连续段排序。

给定一个 \(1,2,\dots,n\) 的排列 \(q\),问有多少个 \(p\) 满足 \(f(p)=q\)

\(n\le 500\)

题解

真想不到啊。只会 \(q=[1,2,\dots,n]\)

先考虑 \(q=[1,2,\dots,n]\) 怎么做。可以发现,设 \(\operatorname{fix}(p)\)\(p\) 中满足 \(\max_{j=1}^i p_j=i\)\(i\) 个数,则充要条件是 \(\operatorname{fix}(p)\ge k\)

由于 \(\operatorname{fix}\) 等于某个值的排列就是若干个 \(\operatorname{fix}=1\) 的排列拼起来得到的,所以先算长为 \(i\)\(\operatorname{fix}(p')=1\) 的排列 \(p'\) 个数,记为 \(c_i\)

\[c_i=i!-\sum_{1\le j<i} j!\times c_{i-j}. \]

\(c\) 的生成函数是 \(F(x)\),那么 \(\operatorname{fix}(p)=a\) 且长为 \(b\)\(p\) 个数就是 \([x^b]F^a(x)\)

再考虑 \(q\) 不是 \([1,2,\dots,n]\) 的情况。设 \(t\) 是最小的满足 \(q_t>q_{t+1}\) 的位置。显然 \(t\) 应该是一个断点。设断点集合是 \(\{y_1,y_2,\dots,y_c=t,y_{c+1},\dots,y_d\}\)。(先不考虑划分方式和 \(p\) 是不是一一对应的。)

先考虑 \(y_{c+1}\) 后面的部分。假如存在 \(c+1\le i<d\) 使得 \(y_i\neq y_{i-1}+1\),也就是说在 \((t,y_{c+1}]\) 这一段后面有一段的长度大于 \(1\),那么我们可以把这一段分裂成两段,然后将 \((y_{c-1},t]\)\((t,y_{c+1}]\) 这两段合并,使得 \(f(p)\) 更小。所以断点集合应该是 \(\{y_1,y_2,\dots,y_c=t,y_{c+1},y_{c+1}+1,\dots,n\}\)

然后考虑 \((y_c,y_{c+1}]\) 这一段。设 \(t'=y_{c+1}\)。我们发现一定需要有 \(p_{t'}=q_{t+1}\),否则可以将 \(t'\) 放到下一段里,然后就转化成上一种情况了。此外,在 \(p\)\((t,t')\) 这段区间里的所有元素都需要大于 \(q_t\),否则可以将小于 \(q_t\) 的那个放到上一段里,使得 \(f(p)\) 更小。

发现上述条件是充分的,并且一个合法排列 \(p\) 对应了恰好一个 \(t'\)。所以先枚举 \(t'\),然后 \(\operatorname{fix}([p_1,p_2,\dots,p_t])\) (这里假设我们先把这个子排列离散化了)需要等于 \(k+t'-n-1\),而 \(p_{t+1},p_{t+2},\dots,p_{t'-1}\) 可以任意排列。于是这个的方案数就是

\[[x^t]F^{k+t'-n-1}(x)\times (t'-t-1)!. \]

对所有 \(t'\) 求和。时间复杂度 \(O(n^3)\)

posted @ 2023-11-08 22:19  Alan_Zhao_2007  阅读(0)  评论(0)    收藏  举报