zoukankan      html  css  js  c++  java
  • 模拟76 题解

    A. 序列

    观察部分分,可以得到一些奇怪的构造方法。

    比如当$N=A*B$,直接将数按$A$的大小或$B$的大小分块就可以了

    接着打表,发现似乎全部的情况都可以通过类似的方法构造出来。

    只要对后面的部分分块,前面不足的部分不用分块。

    B. 购物

    奇妙的数的范围很宽泛,达到$[k,2k]$的程度。

    显然的结论是:对于$[lceil frac{a_{max}}{2} ceil,sum limits_{i=1}^{n}a_i]$的一切数,都是奇妙的。

    所以可以拿到70分。

    仔细想想,可以用一个类似背包的过程来进行这个$dp$。

    首先将权值0加入数组$p$,

    依次考虑$a_i$,

    对于$p$中每一个数,在选$a_i$和不选的情况下分别加入数组$q$。

    对数组$q$进行排序。 清空数组$p$。

    如果$q_{i+1}已经大于当前$p$的最后一个值的两倍,那么加入$q_i$到$p$数组的末尾。

    显然$p$数组的大小不会超过$2*log_2sum$,所以时间复杂度是正确的。

    在加法的意义下,因为奇妙的数的区间达到$[k,2k]$,

    对于加入一个非负数,相邻两个数会由$p_i$,$p_{i+1}$,变为$p_i+x$,$p_{i+1}+x$

    由于保证$p_i*2>p_{i+1}$,$p_i*2+x*2>p_{i+1}+x$是显然的。所以正确性是可以证明的。

    最终考虑相邻两个数可以统计答案。

    C. 计数

    对于$m=0$,显然答案为卡特兰数。

    然后发现暴搜似乎挺难打的,所以直接搞正解。

    显然我们关注的状态有:

    当前节点,子树大小,中序遍历意义下的排名。

    所以直接将这个设为状态,进行$dp$,

    对于一些限制,只要判断是否合法之后转移。

    对于这个合法性判断,显然可以直接枚举数对,简单转化题意,即范围内是否存在一个点,直接用二维前缀和处理。

    因为状态数较少,$dp$进行过程可以为记忆化搜索。

    然后就会发现,似乎没有用到状态的最后一维,也就是中序遍历排名。

    实际上确实是这样的,因为在中序遍历下不合法的点对,都在其$lca$处被判断掉了。

  • 相关阅读:
    Python long() 函数
    Python frozenset() 函数
    java对象和构造方法的区别
    回顾方法和方法调用及加深
    面向过程&面向对象
    稀疏数组
    冒泡排序与八大排序
    Arrays类与常用功能
    二维数组的理解代码
    数组的使用
  • 原文地址:https://www.cnblogs.com/skyh/p/11689865.html
Copyright © 2011-2022 走看看