CF1349F1 & 2 [* so hard]
定义好序列为:
- 所有元素都是正整数。
- 假设 (k e 1) 且 (k) 在序列中出现过,那么 (k-1) 在 (k) 最后一次出现的位置之前出现过。
设 (f_p(i)) 为 “好序列” (p) 中 (i) 的出现次数,你需要对于 (i=1,2,3...n) 求出:
其中 (S) 表示好序列构成的集合。
- F1: (nle 5000)
- F2: (nle 10^5)
答案对 (998244353) 取模。
Solution
- F1
神仙映射:
对于一个长度为 (n) 的排列我们在 (a_i) 和 (a_{i+1}) 之间根据大小关系插入 <
号和 >
号,然后定义 (f_{a_i}) 的权值为前面的小于号数量 (+1),可以验证这样生成的序列为好序列:
这是因为考虑连续的 >
号,他们对应的都是相同的权值,他们在我们对应的序列中出现位置单调递减,那么对于一个 <
号,设出现在 (a_{i},a_{i+1}) 之间,那么 (a_i) 必然是相同的权值中的第一个元素,而 (a_{i+1}) 则为此类元素中的最后一个位置,同时显然为 (a_i<a_{i+1}) 此限制最严。
类似的,我们对于一个好序列,依次枚举每个权值 (i) 然后根据出现的位置从后往前拿出每个权值对应的位置,这样就可以还原我们的排列了,于是每个好序列与一个排列一一对应。
接下来我们对排列考虑此问题,(f_p(i)) 更形象化的描述是排列中单调递减的段中的第 (i) 个段的元素数量。
现在考虑对于 (k) 计算答案,我们依次枚举这个段里面的每个元素,对于元素 (j) 他相当于钦定前 (1sim j) 中有 (k-1) 个 <
号,然后剩余位置任意贡献即可。
此时内部的权值是任意选/独立贡献的,我们只需要考虑 (1sim i) 中的排列存在 (k-1) 个 <
号的方案数然后就可以映射上去了。
设 (f_{i,j}) 表示 (1sim i) 的存在 (j) 个 <
号的方案数,不难发现答案即为:
(mathcal O(n^2)) 的通过 dp 以预处理 (f_{i,j}) 即可通过此版本。
- F2