zoukankan      html  css  js  c++  java
  • 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})

  • 相关阅读:
    关于JDK中自带的类加载器
    关于Spring框架
    关于Java JUC
    数据库-数据添加与删除-视图-索引-存储过程
    数据库-查询练习
    数据库-数据类型-数据库创建表的 约束以及 DDL操作
    数据库-多表连接查询
    数据库笔记整理-数据库概述-三大范式及数据库基本命令
    JAVA笔记整理-JAVA网络编程-TCP/UDP传输
    JAVA笔记整理-线程二
  • 原文地址:https://www.cnblogs.com/y-dove/p/15028418.html
Copyright © 2011-2022 走看看