笛卡尔树

用的有点少的数据结构

笛卡尔树

前置知识

单调栈

正文

性质

笛卡尔树,是一种不常用的数据结构吧,其同时满足二叉搜索树和小根堆的性质

假设们有一个数组aia_i,将其数组的下标记为kk,其权值记为ww,那么建成的笛卡尔树满足以下性质:

  1. kk值满足二叉搜索树的性质,lsk<k<rskls_k<k<rs_k
  2. ww值满足小根堆的性质,lsw<w,rsw<wls_w<w,rs_w<w

图片来源自OI Wiki

建树

首先加入第ii个数时,ii肯定在[1i1][1,i-1]构成的树右链的末尾节点,此时先插入ii,将其插到右链末尾节点,但此时这颗树不一定满足第二个性质,需要对其进行调整,若此时ii的父节点的ww值比ii大,一直找到右链上ww值比ii小的然后,先将ii节点的左儿子设为这个节点的右儿子,再将这个节点的右儿子设为ii,将nn个点插入后,即可得到一棵笛卡尔树。

1
2
3
4
5
6
7
8
9
10
11
12
void build()
{
int top=0,st[maxn];
memset(st,0,sizeof(st));
for(int i=1;i<=n;i++)
{
while(top&&a[st[top]]>a[i])top--;
if(!top)ls[i]=st[top+1];
else ls[i]=rs[st[top]],rs[st[top]]=i;
st[++top]=i;
}
}

问题

我也不知道能干啥 🙃

作者

Jekyll_Y

发布于

2022-07-24

更新于

2023-03-02

许可协议

评论