• FJ省队集训2021


    也许是最后一篇(blog)

    呐,别说这么悲伤的事情

    哪怕只有10%的希望,我也要付出100%的努力

    D6T1(消失的序列).

    题意:略

    solution:

    我们考虑什么样的序列是不合法的,我们考虑这么从大到小考虑,考虑最大值,那么显然在最大值前面,栈必须为空,否则如果最大值塞入栈中且栈不为空,那么一定不会合法

    先不考虑字典序的限制

    那么我们可以沿最大值割开,设位置为 (mx) ,那么下标(1-(mx-1))的值域也恰为([1,mx-1]),(mx+1,n)的值域为([mx,n-1])

    归纳一下,我们可以发现不合法当且仅当存在 (i,j,k),使得(i < j < k),且(s_k < s_i < s_j)

    我们考虑一个桶,我们不妨将存在的位置叫做黑色,否则白色,从小到大扫过去,如果你在(p_j)前面有白色在黑色前面,那么一定不合法,因为设那个黑色为(i),白色为(k),那么一定有(i < j < k),且(s_k < s_i < s_j)

    然后我们考虑限制,那么假设(1-i)都相等,然后(p_{i+1} > A_{i+1}),那么我们可以发现,我们接下来要填的位置一定是第一个黑色的连续段,且满足 (Catalan) 的递推公式,后面的 (Catalan) 数的连乘积我们可以事先维护,第一段(我们需要决策)的答案类似于

    (sum_{i = 0}^x C_i * C_{a-i})

    咋一看是(n^2),但是我们注意到每次相当于把一个白色段划成两个,那么意味着如果我们可以在(O(min{x,a-x}))的复杂度做,复杂度就是(O(nlog n))

    那么我们只需在 (a-x < x)时计算(sum_{i = 0}^{a}C_i*C_{a-i} - sum_{i=x+1}^aC_i*C_{a-i})即可

    (sum_{i = 0}^{a}C_i*C_{a-i} = C_{a+1})

  • 相关阅读:
    ES6和Node.js的import和export
    重写Router.prototype.push后还报NavigationDuplicated错误的解决方法
    nightwatch对前端做自动化测试
    使用video.js 7在html中播放rtmp视频流
    UEFI开发环境搭建
    类的静态成员
    const成员函数
    类和结构
    最长递增子序列
    C语言将十六进制字符串转化成十六进制
  • 原文地址:https://www.cnblogs.com/y-dove/p/15028418.html
Copyright © 2020-2023  润新知