码迷,mamicode.com
首页 > 其他好文 > 详细

笛卡尔树

时间:2020-01-22 23:59:33      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:class   出栈   复杂   treap   code   二叉搜索树   int   就是   最大   

笛卡尔树是一棵二叉树,每个节点的编号满足二叉搜索树的性质,即二叉树的中序遍历是原数列,每个节点的权值满足堆的性质,也就是说,\(Treap\)就是笛卡尔树

在笛卡尔树上两个点的\(LCA\)就是这一区间的最值

用增量法来建树,维护一个单调栈,栈内元素为右子树链

因为每个节点最多进栈出栈一次,所以时间复杂度是\(O(n)\)

若不是序列,则是考虑二元组\((a,b)\)\(a\)满足二叉搜索树的性质,\(b\)满足堆的性质

建树前先以\(a\)为关键字排序

笛卡尔树本质为单调栈的另一种形式,所以可以用来解决最大子矩形问题

\(code:\)

void build()
{
    for(int i=1;i<=n;++i)
    {
        while(top&&a[st[top]]>a[i]) ls[i]=st[top--];
        if(top) rs[st[top]]=i;
        st[++top]=i;
    }
}

笛卡尔树

标签:class   出栈   复杂   treap   code   二叉搜索树   int   就是   最大   

原文地址:https://www.cnblogs.com/lhm-/p/12229781.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!