题解 [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\) 的生成函数是 \(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}\) 可以任意排列。于是这个的方案数就是
对所有 \(t'\) 求和。时间复杂度 \(O(n^3)\)。

浙公网安备 33010602011771号