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

  • 相关阅读:
    为什么要把js代码写到<!--//-->中
    js逻辑与,或,非
    你不知道的JavaScript——第二章:this全面解析
    你不知道的JavaScript——this词法
    如何避免用户多次点击造成的多次请求
    通用模块设计UMD
    你不知道的JavaScript——第一章:作用域是什么?
    github 操作
    数组中元素累加 reduce
    流星雨
  • 原文地址:https://www.cnblogs.com/Grice/p/12566702.html
Copyright © 2011-2022 走看看