ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

笛卡尔树

2022-07-13 22:31:08  阅读:278  来源: 互联网

标签:结点 右链 val 笛卡尔 元素 key


笛卡尔树就是每个结点有两个值 val 和 key,其中 val 满足 BST 的性质而 key 满足堆的性质。treap 就是一棵笛卡尔树。
可以证明给定 val 和 key 的前提下笛卡尔树的形态是唯一的。
很明显借助于平衡树的知识我们能 \(O(n\log n)\) 进行构建。
但是,当给定的元素已经按照键值 val 排好序了,我们完全可以做到线性。方法如下。

首先,我们注意到由于 val 有序,我们每次插入的位置一定是右链末端。
于是我们有这样的算法:
每次插入一个元素的时候,从下往上与右链中的元素进行比较直到找到位置,然后把原来右链中的结点整体作为当前结点的左子树。
这个过程很明显可以用栈来模拟。注意到每个元素最多入栈一次,于是我们就做到了线性复杂度。

上图。框出的部分就是用栈维护的右链。


(图源自OI-wiki

luogu模板题核心代码:
(为了卡常手写了栈

for(int i=1;i<=n;++i)
{
    a[i]=read();
    pos[a[i]]=i;
    if(!top){st[++top]=a[i];continue;}
    int lasttop=0;
    while(top&&a[i]<st[top])lasttop=st[top--];
    if(top)rs[pos[st[top]]]=pos[a[i]];
    st[++top]=a[i];
    ls[pos[a[i]]]=pos[lasttop];
}

标签:结点,右链,val,笛卡尔,元素,key
来源: https://www.cnblogs.com/pjykk/p/16475823.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有