道隐于小成,言隐于荣华。.|

⅔钱强

园龄:1年4个月粉丝:5关注:17

笛卡尔树

笛卡尔树

定义

以一个数列为基础,存储数列中元素,满足两个限制的树。一是数列中元素的下标满足二叉搜索树的性质,二是元素的大小满足堆的性质。

建树

使用单调栈,在线建树。考虑从左往右在已有的笛卡尔树中添加元素,因为新元素的下标最大,所以只可能取代最右链中的某个元素,并将其收为左儿子。又由于堆的性质,所以右链元素单调,且弹出就不再加入,使用单调栈维护右链。每个元素加入一次删除一次,时空复杂度均为 O(n)

stk.emplace(0);
p[0]=0;//虚拟节点 
for(int i=1;i<=n;++i){
    while(!stk.empty()&&p[i]<p[stk.top()])stk.pop();
    int pos=stk.top();
    lc(i)=rc(pos);
    t[lc(i)].fa=i;
    rc(pos)=i;
    t[i].fa=pos;
    stk.emplace(i);
}

应用

RMQ问题,各种依赖于min,max的分治,然后转化到树上问题,method of four russians 算法

本文作者:⅔钱强

本文链接:https://www.cnblogs.com/life-of-a-libertine/p/18028442

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   ⅔钱强  阅读(16)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起