用的有点少的数据结构
笛卡尔树
前置知识
单调栈
正文
性质
笛卡尔树,是一种不常用的数据结构吧,其同时满足二叉搜索树和小根堆的性质
假设们有一个数组ai,将其数组的下标记为k,其权值记为w,那么建成的笛卡尔树满足以下性质:
- k值满足二叉搜索树的性质,lsk<k<rsk
- w值满足小根堆的性质,lsw<w,rsw<w

建树
首先加入第i个数时,i肯定在[1,i−1]构成的树右链的末尾节点,此时先插入i,将其插到右链末尾节点,但此时这颗树不一定满足第二个性质,需要对其进行调整,若此时i的父节点的w值比i大,一直找到右链上w值比i小的然后,先将i节点的左儿子设为这个节点的右儿子,再将这个节点的右儿子设为i,将n个点插入后,即可得到一棵笛卡尔树。
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; } }
|
问题
我也不知道能干啥 🙃