码迷,mamicode.com
首页 > 其他好文 > 详细

CF1349F1

时间:2020-11-25 12:03:05      阅读:7      评论:0      收藏:0      [点我收藏+]

标签:sum   关系   描述   --   strong   枚举   定义   bin   还原   

CF1349F1 & 2 [* so hard]

定义好序列为:

  • 所有元素都是正整数。
  • 假设 \(k\ne 1\)\(k\) 在序列中出现过,那么 \(k-1\)\(k\) 最后一次出现的位置之前出现过。

\(f_p(i)\) 为 “好序列” \(p\)\(i\) 的出现次数,你需要对于 \(i=1,2,3...n\) 求出:

\[\sum_{p\in S} f_p(i) \]

其中 \(S\) 表示好序列构成的集合。

  • F1: \(n\le 5000\)
  • F2: \(n\le 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\) 他相当于钦定前 \(1\sim j\) 中有 \(k-1\)< 号,然后剩余位置任意贡献即可。

此时内部的权值是任意选/独立贡献的,我们只需要考虑 \(1\sim i\) 中的排列存在 \(k-1\)< 号的方案数然后就可以映射上去了。

\(f_{i,j}\) 表示 \(1\sim i\) 的存在 \(j\)< 号的方案数,不难发现答案即为:

\[Ans[k]=\sum_i f_{i,k-1}\binom{n}{i}(n-i)! \]

\(\mathcal O(n^2)\) 的通过 dp 以预处理 \(f_{i,j}\) 即可通过此版本。

  • F2

不会。

有空来学吧。咕咕咕。

CF1349F1

标签:sum   关系   描述   --   strong   枚举   定义   bin   还原   

原文地址:https://www.cnblogs.com/Soulist/p/14012917.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!