快来踩爆这个蒟蒻吧|

Little_corn

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

2024-07-24 16:02阅读: 8评论: 0推荐: 0

笛卡尔树

笛卡尔树:

笛卡尔树是关于多个二元组 (ki,wi) 的一棵树,使其所有 k 值满足二叉搜索树的性质,且所有 w 值都满足小根堆的性质。笛卡尔树有一些关于区间最值的美好性质,常常用于处理关于区间最值的问题。

  • 构建方法:

在构建时,对于右链上的元素,自底向上一定是 w 值由小到大的,且一定 k 值从小到大。

所以我们按 k 值从小到大排序,比并按顺序插入右链中。

假设我们轮到第 i 个元素插入,我们先找到在第一个右链中 w 值大于 wi 的元素下标 j 。因为这棵树需要满足二叉搜索树的性质,所以我们将 j 以下的元素接到 i 的左子树上,并将 i 接到 j 的右子树上。

使用栈模拟即可。

qwq
for(int i = 1; i <= n; i++){
while(top && a[stk[top]] > a[i]) top--;
ls[i] = stk[top + 1];
if(top) rs[stk[top]] = i;
stk[++top] = i; stk[top + 1] = 0;
}
  • 性质:
  1. 一个节点 u 的子树内的子节点的值一定均小于等于该节点的值,若它的管辖区间是 [l,r],则对于 l,r,llurr,则 maxi=lrai=au

  2. 一个区间 [l,r] 的最值位置是 l,r 在笛卡尔树上的 LCA

  3. 对于一个 ai,它左边第一个大于等于它的 aj 在笛卡尔树上是它向左的拐点祖先,右边同理。

  4. 对于一个有 n 个节点且随机的笛卡尔树,树高期望为 logn

例题:

本文作者:Little_corn

本文链接:https://www.cnblogs.com/little-corn/p/18320162

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

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