zoukankan      html  css  js  c++  java
  • 「CTSC2018」青蕈领主

    首先有一个想法,就是建出一颗类似树的结构.

    然后(i)个子树合并的方案设为(f[i])

    实质上,(f[n])就是(L:1,1,1,...,n)的方案

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

    这个递推式的含义就是:

    考虑从大到小(或从小到大)插入数

    假设此时已经有([2,n+1])

    分两种情况

    (part1:)
    此时序列满足条件,那么(1)只要不和(2)挨着就不会有问题,即(f[n - 1]*(n+1-2))
    (part2:)
    此时序列不满足条件,那么我们可以使用(1)截断一段不合法的区间.
    因为(1)只能截断一段,我们枚举这一段的长度(iin[2,n-2])
    然后把(1)放进(i)个的方案为(f[i])
    (1)放进去后,这一段就相当"1"去继续截断,即(f[n-i])
    考虑给这一段分配权值(实际上等于展开一个点)
    一共(n-j+1)个点
    含有(2)的点是不能展开的(1截不断)
    最后一个点不用截
    然后又因为含有(2)的点一定不在最后(因为(2)是最小的,所以序列不可能合法)
    所以可以展开的点为(n-j-1)

    这个式子显然可以分治(NTT)

  • 相关阅读:
    HDU 6984
    洛谷 P6776
    C语言 error C4996: This function or variable may be unsafe
    C语言 sizeof 函数
    C语言 strlen 函数
    C语言 char 字符串
    C语言 goto 语句
    C语言 switch 语句
    C语言 do while 和 while 循环
    C语言 while 循环
  • 原文地址:https://www.cnblogs.com/zzy2005/p/13033394.html
Copyright © 2011-2022 走看看