zoukankan      html  css  js  c++  java
  • COGS 2421.[HZOI 2016]简单的Treap 题解

    题目大意:

    给定n个数及其优先级,求对应的符合最小堆性质的Treap的先序遍历。

    n<=500000。

    解法:

    目前为止我只想到了三种解法,其中第三种是正解。

    1.暴力1

    以优先级为关键字排序,然后按顺序构建BST即可。注意不能加平衡,因为这样会改变树的先序遍历。

    期望复杂度O(nlogn)(排序和构建),考虑极端情况下树可能是一个链,最坏情况复杂度O(n2)。

    2.暴力2

    直接构建Treap,但遇到是链的情况仍然是O(n2)。

    考虑将节点顺序打乱后进行建树,常数大大减小,但由于链状树的深度为n,最坏情况仍然O(n2)(这个复杂度是达哥提出的,不知道对不对)。

    3.RMQ+分治

    考虑以数大小为关键字排序,那么显然排序后一个点的左子树就在它的左边,右子树就在它右边,而对于一个区间[l,r],显然它对应的子树的树根就是区间中优先级最小的点,这样就转化为了RMQ问题。

    具体做法:

    1.把元素按数的大小排序,用Sparse-Table算法预处理RMQ。

    2.初始区间为[1,n],每次从区间中选出优先级最小的点作为子树的根,递归建左子树和右子树(虽然实现过程中并不用真的建树)。

    由于每个点都被选作树根并往下递归一次,而Sparse-Table的查询是O(1)的,因此总复杂度为O(nlogn)(排序),如果使用线性排序则可以降到O(n)。

    后记:

    这个题也是一时脑洞的产物,主要是受蓝书中Treap唯一这句话的启发,因此出了这么一道题。

    这道题的解法也是一时脑洞,不过确实不错,值得借鉴。

    其实一开始本来想卡暴力,发现标程最后两个点要跑1s多一点点,因此时限开的1.5s,这下暴力1就有了80分,至于暴力2,估计是卡不住的了。

    最近出题不少,估计是要发扬ad神犇的优良传统了。

    233333333
  • 相关阅读:
    Django---Blog系统开发之注册页面(验证码&ajax发送文件)
    Django---Blog系统开发之建库
    Eclipse下导入外部jar包的3种方式
    linux 下 .sh 文件语法
    热备,冷备,云备的区别
    plsql 中如何清除曾经登录过的用户名
    Mac 查看python安装路径
    mac terminal终端怎么退出python命令行
    PyCharm 2017 Mac 免注册版破解安装说明
    PL/SQL恢复默认窗口样式
  • 原文地址:https://www.cnblogs.com/hzoier/p/5747227.html
Copyright © 2011-2022 走看看