笛卡尔树

笛卡尔树

定义

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

建树

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

posted @ 2024-02-22 23:39  妖灵梦  阅读(24)  评论(0)    收藏  举报