zoukankan      html  css  js  c++  java
  • CF751E

    题意

    对于两个(n)元排列(A,B),定义其距离为,反复将(A)任意两个位置的元素交换,使得(A)变成(B),的最小操作次数。先给定两个残缺的(n)元排列,要求将?位置填上数字,使得距离(iin[0,n)),的答案(ans_i)

    做法

    考虑两个完整的排列(A,B),其距离为:将(A_i)(B_i)连边,(n-)环个数

    对于两个残缺的数字,也同样连边,将?换成(0),不过其中的(0)我们保留下来。
    例如(A_i=1,B_i=0;A_j=0,B_j=1),则会形成(0-0)(A_i=1,B_i=0;A_j=2,B_j=1),则会形成(0-2)
    因为中间的数字是没用的

    提前将已经形成的环去掉
    最后形成三类两个点的链:(0-0)(0-x)(x-0)
    考虑将(0-x_1,x_2-0)拼接的情况

    • (0-x_1),(x_2-0)这样拼,是不行的,因为(x_1 eq x_2),否则一开始这条链就会被缩为(0-x)
    • (x_1-0),(0-x_2)这样拼,那么必然是将两个(0)换成(x_3)(x_1-x_3-x_2),同上(x_1 eq x_2),所以后面至少得拼个(0-0)(0-0)变为(x_2-x_1),使得(x_1-x_3-x_2-x_1)从而形成环。
      这一类情况我们稍后考虑

    考虑将(0-x)这一类单一的链拼接

    • (0-x_1-0-x_2),这类是可以很简单的拼成环。故任意(i)(0-x)拼成环

    考虑将(x-0)这一类单一的链拼接

    • 同上

    (0-0)先等一等再考虑

    先处理(0-x)单一的链恰好拼接成(i)个环的方案数(f_i)
    不过不好直接处理,令(g_i)为至少拼接成(i)个环的方案数
    (g_i=sumlimits_{j=i}^m {mchoose j}S_{j,i}(k+m-j)^{underline{m-j}})

    (m)(0-x)的链数量,(k)(0-0)的链数量
    枚举(j)(0-x),通过第一类斯特林数算拼成环的方案数,然后剩下(m-j)的,选择前驱,可以选择自己,若选择自己,则单独(x-x)形成单点环
    此时,若(0-x)前接(0-0),则形成(0-0)
    (0-x)前接(0-x),仍然是(0-x)
    最后全部处理完后,要么是(0-x)形成了环,要么是(0-0)。显然(0-0)的链个数是不变的
    然后二项式反演能得到(f_i)

    同样的,可以得到(h_i)(x-0)单一的链恰好拼接成(i)个环的方案数

    (k)(0-0)链数量,形成(i)个环(l_i),还需要将链头标号,使得成为(0-x)(l_i=S_{k,i}k!)

    然后三个卷积一下

  • 相关阅读:
    前端数据可视化插件(二)图谱
    前端数据可视化插件(一)图表
    CSS性能优化
    HTML性能优化
    github前端资源
    javascript生成n至m的随机整数
    原生js获取元素样式
    模式二之框架模式
    kendo-ui的使用和开发自己的组件
    pycharm安装报错Non-zero exit co?
  • 原文地址:https://www.cnblogs.com/Grice/p/12963514.html
Copyright © 2011-2022 走看看