首页 > 其他分享 >笛卡尔树讲解

笛卡尔树讲解

时间:2022-11-14 23:23:35浏览次数:65  
标签:插入 结点 右链 笛卡尔 stk treap 讲解

前言

笛卡尔树 算是比较基础的数据结构了,但需要 笛卡尔树 的题目较少,且很多 笛卡尔树 的题都可以用其他解法解决,所以这个算法并不算的上热门,然而就在前天晚上,CF1748E 这道题需要用到 笛卡尔树 解决,所以蒟蒻のyzh打算写一篇笛卡尔树的文章,来温故这个算法!

文章中部分图片使用了OIwiki的图片,如有侵权 私信删图


笛卡尔树の性质

定义二元组 \((k,w)\) 组成一棵树,其中 \(k\) 满足二叉搜索树性质,而 \(w\) 需要满足的性质(通常是小顶堆,具体根据题目要求)。

例如下图(图片来源:维基百科)

上图是笛卡尔树的一种:

二元组 \((k,w)\) ,对于一个序列 \(a_1,\cdots ,a_n\) ,\(k\) 为下标 \(i\),\(w\) 为 \(a_i\)。

关于treapの小疑问?

读者看到这可能会认为,这不就treap吗?没错,笛卡尔树就是treap一种形态,只不过笛卡尔树插入时,\(k\) 值一定是单调的! 所以下面的构建操作总复杂度为 \(O(n)\).

构建

过程

我们考虑将元素按照键值 \(k\) 排序。然后一个一个插入到当前的笛卡尔树中。

考虑如何满足笛卡尔树性质。

每次我们插入的元素必然在这个树的右链(右链:即从根结点一直往右子树走,经过的结点形成的链)的末端。从下往上比较右链结点与当前结点 \(u\) 的 \(w\),如果找到了一个右链上的结点 \(x\) 满足 \(x_w<u_w\),就把 \(u\) 接到 \(x\) 的右儿子上,而 \(x\) 原本的右子树就变成 \(u\) 的左子树。显然这样就可以满足笛卡尔树性质了。

如下图,图中红色框框部分就是我们始终维护的右链:

build

显然每个数最多进出右链一次。这个过程用栈维护,栈中维护当前笛卡尔树的右链上的结点。一个点不在右链上了就把它弹掉。这样每个点最多进出一次,复杂度 \(O(n)\)。

实现

for (int i = 1; i <= n; i++) {
  int k = top;
  while (k > 0 && h[stk[k]] > h[i]) k--;
  if (k) rs[stk[k]] = i;  // rs代表笛卡尔树每个节点的右儿子
  if (k < top) ls[i] = stk[k + 1];  // ls代表笛卡尔树每个节点的左儿子
  stk[++k] = i;
  top = k;
}

例题

CF1748E

HDU 1506 最大子矩形

标签:插入,结点,右链,笛卡尔,stk,treap,讲解
From: https://www.cnblogs.com/I-am-yzh/p/16890906.html

相关文章

  • node的模块讲解
    node的模块划分 内置模块(不需要安装的)http(提供http服务的)fs(fileSystem文件系统)url(url地址)path(路径)event(事件源)net(通信)io(流)... 第三方模块(需要安装)expressmd......
  • 笛卡尔树
    笛卡尔树是一种二叉搜索树,同时也满足大根堆或小根堆的性质,Treap也是一种笛卡尔树。每个节点记录信息(x,y),对于x是二叉搜索树,对于y是小根堆,在x递增的情况下,可以线性时间内......
  • 【Python基础】快速入门Python(讲解、习题)
    0.导语Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于......
  • 深度讲解React Props
    一、props的介绍当React遇到的元素是用户自定义的组件,它会将JSX属性作为单个对象传递给该组件,这个对象称之为“props”。函数声明的组件,会接受一个props形参,获取属性传递......
  • 【云原生】Sqoop on k8s 讲解与实战操作
    目录一、概述二、开始编排部署1)下载Sqoop部署包2)构建镜像3)创建sqoopchart模板4)修改yaml编排5)开始部署6)测试验证1、数据从MYSQL导入到HDFS(Import)【1】创建JDBC连接【2】......
  • RUST包管理 模块系统讲解
    RUST包管理模块系统0一些基本概念package:包,cargonew生成的整个项目应该可以叫做包(我个人理解是这样的,至少package是最顶层的)一个package包含零个或一个库crate(lib......
  • 【云原生】Minio on k8s 讲解与实战操作
    目录一、概述二、开始编排部署1)下载chart包2)构建镜像3)修改yaml编排4)开始部署5)测试验证6)卸载一、概述MinIO是在GNUAffero通用公共许可证v3.0下发布的高性能对象存......
  • 笛卡尔树
    堆+BST性质笛卡尔树的子树是对应序列上一段连续的区间考虑BST,最初\([1,n]\),考虑划分开rt,分割成左右2个区间,且两个区间对应2棵子树,分治下去得证。构造考虑对......
  • 安卓根文件系统目录讲解
    1.顶层目录apex: apex文件安装路径,android10引进的技术,AndroidPonyEXpress(APEX),APEX和APK类似,它原来存在于只读系统分区的功能模块搞成一个个可更新升级的模块,......
  • CH58X/CH57X/V208 Observer(观察者)例程讨论讲解
    使用的是沁恒的CH582M的Observer例程与官方的demo板。本例程的功能是主机扫描到从机的MAC地址并打印出来。先对宏定义进行理解讨论。 最大响应扫描数为8,在串口调试助......