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!)

    然后三个卷积一下

  • 相关阅读:
    Java-常用类、接口关系图谱
    Java基础语法09-面向对象下-内部类-注解-异常
    Java基础语法08-面向对象-枚举-包装类-接口
    Java-常用类、接口API
    Docker学习系列(三)Docker搭建gitlab的两种方式
    Docker学习系列(二)Docker初体验
    Docker学习系列(一)Docker简介
    ZooKeeper介绍与环境搭建
    JDK工具系列之jps
    Mycat数据库中间件对Mysql读写分离和分库分表配置
  • 原文地址:https://www.cnblogs.com/Grice/p/12963514.html
Copyright © 2011-2022 走看看