zoukankan      html  css  js  c++  java
  • loj2554

    题意

    对于一个排列(P),定义映射(f:P ightarrow l)(l_i)(P)中第(i)个位置最靠左的位置使得区间([i-l_i+1,i])(P)上对应的整数集合是连续的
    给定(l),求有多少不同的(P)通过(f)映射后为(l)

    做法

    对于(n)对区间([l_i,i]),要么相离要么包含,抽象成一棵树

    对于一个点,令其区间长度为(len),有(k)个儿子,要将([1,len])分配给(k)个儿子,满足

    • 每个儿子内都是连续的
    • 将儿子离散成一个数字时,没有非平凡的连续区间

    (f_i)为:没有非平凡连续区间的(i+1)排列个数
    (Ans=prodlimits_{i=1}^n f_{l_i})

    边界情况(f_0=1,f_1=2),通式:

    [f_{n}=(n-1)f_{n-1}+sum_{i=2}^{n-2}(i-1)f_if_{n-i} ]

    证明:
    将一个合法数组(A)映射到(B)(b_{a_i}=i)
    (A)没有非平凡连续区间的(Longrightarrow)(B)不存在不包含最大元素的非平凡连续区间
    已插入([1,n]),将元素整体(+1),现在考虑往里面插(1)
    (1)~~)原序列已合法
    只要(1)不在(2)旁边就好了。有(n+1-2=n-1)个位置
    (2)~~)原序列不合法
    最多有一个极长区间不合法,设其长度为(len),则原值域为([x,x+len-1]),然后把(1)插进去破坏
    只考虑这部分,方案数为(f_{len}),相当于把(1)当做里面的(len+1)
    再考虑(x)的范围,([2,n-len]):如果左端点为(1)则插进来没法破坏,如果右端点为(n-len+1)则极大区间为整个序列。所以要乘个(n-len-1)的系数
    然后把这个区间缩成一个点,由于只有一个区间不合法,剩下的方案数为(f_{n-len})
    (2le lenle n-2),左端点右端点要满足区间非平凡
    显然(sum_{i=2}^{n-2}(n-i-1)f_if_{n-i}=sum_{i=2}^{n-2}(i-1)f_if_{n-i})

    直接分治(fft)就好了

  • 相关阅读:
    真正的Java学习从入门到精通
    Java学习从入门到精通(1) [转载]
    Java Learning Path(三)过程篇
    Java Learning Path(五)资源篇
    Java Learning Path(四) 方法篇
    浅析Java语言中两种异常的差别
    JDK,JRE,JVM区别与联系
    JAVA敏捷开发环境搭建
    谈谈WEB开发中的苦大难字符集问题
    java读取clob字段的几种方法
  • 原文地址:https://www.cnblogs.com/Grice/p/12566702.html
Copyright © 2011-2022 走看看