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)就好了

  • 相关阅读:
    Shell中调用java时的参数
    简析echo命令在Linux系统中的使用
    设置Linux环境变量的三种方法
    nohup 后台运行,以及重定向标准输出和标准错误 &/dev/null 文件
    &命令
    linux下卸载gij的java
    在Linux下运行可执行Jar包
    jar参数运行应用时classpath的设置方法
    shell获取当前进程pid和上一个进程pid
    检查文件,如果文件不存在则创建
  • 原文地址:https://www.cnblogs.com/Grice/p/12566702.html
Copyright © 2011-2022 走看看