zoukankan      html  css  js  c++  java
  • CF1349F1

    CF1349F1 & 2 [* so hard]

    定义好序列为:

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

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

    [sum_{pin S} f_p(i) ]

    其中 (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)< 号的方案数,不难发现答案即为:

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

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

    • F2

    link

  • 相关阅读:
    反射 元类
    多态
    封装
    继承
    面向基础
    包 logging模块 hashlib模块 openpyxl 深浅拷贝
    常用模块
    re模块(正则表达式)
    模块 导入方式 软件开发目录规范
    第 3 章 镜像
  • 原文地址:https://www.cnblogs.com/Soulist/p/14012917.html
Copyright © 2011-2022 走看看