当前位置: 首页 > news >正文

【笛卡尔树】

笛卡尔树

  • 笛卡尔树
      • 定义
      • 构建
      • 性质
    • 习题
      • P6453 [COCI 2008/2009 #4] PERIODNI
      • CF1913D Array Collapse
      • P4755 Beautiful Pair
      • [ARC186B] Typical Permutation Descriptor

笛卡尔树

定义

笛卡尔树是一种二叉树,每一个节点由一个键值二元组 ( k , w ) (k,w) (k,w) 构成。要求 k k k 满足二叉搜索树的性质,而 w w w 满足堆的性质。如果笛卡尔树的 k , w k,w k,w 键值确定,且 k k k 互不相同, w w w 也互不相同,那么这棵笛卡尔树的结构是唯一的。

通俗的讲,笛卡尔树是一个二叉树,中序遍历是原序列,同时满足堆性质。

构建

以小根堆笛卡尔树为例。

法1
在这里插入图片描述
观察上图笛卡尔树,我们发现,一个节点的父亲就是 左边第一个比它小的右边第一个比它小的 的较大的那个。

写个单调栈来回跑两遍即可。

法2
我们考虑将元素按下标顺序依次插入到当前的笛卡尔树中。那么每次我们插入的元素必然在这棵树的右链(右链:即从根节点一直往右子树走,经过的节点形成的链)的末端。于是我们执行这样一个过程,从下往上比较右链节点与当前节点 u u u w w w,如果找到了一个右链上的节点 x x x 满足 w x < w u w_x<w_u wx<wu,就把 u u u 接到 x x x 的右儿子上,而 x x x 原本的右子树就变成 u u u 的左子树。

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

在这里插入图片描述
模板P5854

	cin>>n;for(int i=1;i<=n;i++){cin>>a[i];while(Sid&&a[S[Sid]]>a[i])Sid--;l[i]=S[Sid+1];if(Sid)r[S[Sid]]=i;S[++Sid]=i;S[Sid+1]=0;}

性质

  • 区间 [ l , r ] [l,r] [l,r] 的极值所在为 l , r l,r l,r 在笛卡尔树上的 LCA。
  • 每个数左右两边第一个比它大/小的数分别是它在笛
    卡尔树上的父亲和“拐点祖先”。
  • 随机笛卡尔树的树高是 O ( log ⁡ n ) O(\log n) O(logn) 的。

习题

P6453 [COCI 2008/2009 #4] PERIODNI

在这里插入图片描述

1 ≤ n , k ≤ 500 1\le n,k\le 500 1n,k500,层高不会超过 1 0 6 10^6 106

考虑在第 i i i 列和第 j j j 列 的第 h h h 层都放了一个数,那么要求中间断开,即 min ⁡ k = i j a i < h \min_{k=i}^j a_i <h mink=ijai<h,其中 a i a_i ai 为第 i i i 列层数。

考虑建出小根堆笛卡尔树。

在这里插入图片描述

分成了若干矩形,树形DP即可。

CF1913D Array Collapse

link

在这里插入图片描述
1 ≤ n ≤ 3 × 1 0 5 , 1 ≤ p i ≤ 1 0 9 1\le n\le 3\times 10^5,1\le p_i \le 10^9 1n3×105,1pi109

  • 考虑建立一棵小根堆笛卡尔树。
  • 每个子树的根节点对应一段区间 [ l , r ] [l,r] [l,r] 的最小值的位置 x x x
  • 左子树表示 [ l , x − 1 ] [l,x-1] [l,x1],右子树表示 [ x + 1 , r ] [x+1,r] [x+1,r]
  • f u f_u fu 表示以 u u u 为根(即区间 [ l , r ] [l,r] [l,r] )的方案数,也记为 f [ l , r ] f[l,r] f[l,r]
  • 如果不删除 u u u,方案为 f [ l , x − 1 ] × f [ x + 1 , r ] f[l,x-1] \times f[x+1,r] f[l,x1]×f[x+1,r]
  • 考虑删除 u u u,因为是在笛卡尔树上 dp。
  • 所以如果 l > 1 l>1 l>1,那么 u u u 可以被左边删掉,方案数为 f [ x + 1 , r ] f[x+1,r] f[x+1,r]
  • 同理 r < n r<n r<n,方案数为 f [ l , x − 1 ] f[l,x-1] f[l,x1]
  • 如果都能被两边删除,算重的方案为 1 1 1(全部删掉)。

P4755 Beautiful Pair

link
在这里插入图片描述
1 ≤ n ≤ 1 0 5 , 1 ≤ a i ≤ 1 0 9 1\le n \le 10^5,1\le a_i\le 10^9 1n105,1ai109

  • 考虑建立一棵大根堆笛卡尔树。
  • 同上一题,每个子树的根节点对应一段区间 [ l , r ] [l,r] [l,r] 的最大值的位置 x x x
  • 类似分治,考虑计算跨过 x x x 的方案数。
  • 枚举短的一边(不妨假设是左边),设 i ∈ [ l , x ] i\in[l,x] i[l,x],那么需要查询 [ x , r ] [x,r] [x,r] ≤ a x a i \large \le \frac{a_x}{a_i} aiax的数的个数。
  • 容易证明枚举次数不超过 n log ⁡ n n\log n nlogn次。
  • 直接主席树维护即可。

[ARC186B] Typical Permutation Descriptor

link

在这里插入图片描述

1 ≤ N ≤ 3 × 1 0 5 , 0 ≤ A i < i 1\le N \le 3\times 10^5,0\le A_i< i 1N3×105,0Ai<i

不难发现 P A i P_{A_i} PAi 即是 i i i 左边第一个比 A i A_i Ai 小的数,根据这一点建立笛卡尔树,则原问题变为在笛卡尔树上填数的方案数,简单DP即可。

相关文章:

【笛卡尔树】

笛卡尔树 笛卡尔树定义构建性质 习题P6453 [COCI 2008/2009 #4] PERIODNICF1913D Array CollapseP4755 Beautiful Pair[ARC186B] Typical Permutation Descriptor 笛卡尔树 定义 笛卡尔树是一种二叉树&#xff0c;每一个节点由一个键值二元组 ( k , w ) (k,w) (k,w) 构成。要…...

Java堆外内存的高效利用与性能优化

在Java开发中&#xff0c;堆外内存&#xff08;Direct Memory&#xff09;是除Java堆以外的内存区域。它允许Java程序直接分配和管理非堆内存&#xff0c;这为高性能的数据处理提供了可能。 1、 什么是堆外内存&#xff1f; 堆外内存&#xff0c;也称为直接内存&#xff08;D…...

【Unity3D优化】使用ASTC压缩格式优化内存

在Unity3D手游开发中&#xff0c;合理选择纹理压缩格式对于优化内存占用、提高渲染效率至关重要。本文将记录近期在项目内进行的图片压缩格式优化过程&#xff0c;重点介绍从ETC2到ASTC 5x5的优化方案及其带来的收益。 1. 现状分析&#xff1a;从ETC2到ASTC 6x6 block 在项目…...

iptables网络安全服务详细使用

iptables防火墙概念说明 开源的基于数据包过滤的网络安全策略控制工具。 centos6.9 --- 默认防火墙工具软件iptables centos7 --- 默认防火墙工具软件firewalld&#xff08;zone&#xff09; iptables主要工作在OSI七层的二、三、四层&#xff0c;如果重新编译内核&…...

MiC建筑引领未来:中建海龙的探索与实践

随着全球城市化进程的加速推进&#xff0c;建筑行业正面临着前所未有的挑战与机遇。如何高效、环保地建造高质量的建筑&#xff0c;成为了行业内外普遍关注的焦点。在此背景下&#xff0c;MiC&#xff08;Modular Integrated Construction&#xff0c;模块化集成建筑&#xff0…...

清华精品资料:DeepSeek从入门到精通、DeepSeek赋能职场

今天电脑天空给大家推荐2份清华大学专家编写的DeepSeek的使用手册&#xff0c;分别是《DeepSeek从入门到精通》和《DeepSeek赋能职场》。 《DeepSeek从入门到精通》是一本系统化的技术指南&#xff0c;旨在帮助用户从零基础到精通掌握通用人工智能模型DeepSeek的核心功能与应用…...

Nginx进阶篇 - nginx多进程架构详解

文章目录 1. nginx的应用特点2. nginx多进程架构2.1 nginx多进程模型2.2 master进程的作用2.3 进程控制2.4 worker进程的作用2.5 worker进程处理请求的过程2.6 nginx处理网络事件 1. nginx的应用特点 Nginx是互联网企业使用最为广泛的轻量级高性能Web服务器&#xff0c;其特点是…...

SpringBoot初始化8个常用方法

在 Spring Boot 中&#xff0c;初始化方法通常是在应用程序启动时被调用的&#xff0c;可以用来执行应用启动时的一些准备工作。以下是几种常见的初始化方法&#xff1a; 一、顺序 1. 图解 ┌─────────────────────────────┐│ Spring Boot…...

boolen盲注和时间盲注

获取当前数据库名 import requestsdef inject_database(url):namemax_length20low{a: 97, z: 122, A: 65, Z: 90, 0: 48, 9: 57, _: 95}high{97: a, 122: z, 65: A, 90: Z, 48: 0, 57: 9, 95: _}for i in range(1, max_length 1):low_val32high_val122while low_val < hi…...

CTF-web:java-h2 堆叠注入rec -- N1ctf Junior EasyDB

代码存在sql注入 // 处理登录表单的POST请求PostMapping({"/login"})public String handleLogin(RequestParam String username, RequestParam String password, HttpSession session, Model model) throws SQLException {// 验证用户凭据if (this.userService.valid…...

TUSB422 MCU 软件用户指南

文章目录 TUSB422 MCU 软件用户指南 目录表格图表1. 介绍2. 配置2.1 通用配置2.2 USB-PD 3.0 支持2.3 VDM 支持 3. 代码 ROM/RAM 大小优化4. 通过 UART 调试4. 移植到其他微控制器 TUSB422 MCU 软件用户指南 摘要 本文档是 TUSB422 微控制器基于 Type-C 端口控制&#xff08;…...

BUU37 [DASCTF X GFCTF 2024|四月开启第一局]web1234100

Hint1&#xff1a;本题的 flag 不在环境变量中 Hint2&#xff1a;session_start&#xff08;&#xff09;&#xff0c;注意链子挖掘 题目&#xff1a; 扫描出来www.zip class.php <?phpclass Admin{public $Config;public function __construct($Config){//安全获取基…...

常见的排序算法:插入排序、选择排序、冒泡排序、快速排序

1、插入排序 步骤&#xff1a; 1.从第一个元素开始&#xff0c;该元素可以认为已经被排序 2.取下一个元素tem&#xff0c;从已排序的元素序列从后往前扫描 3.如果该元素大于tem&#xff0c;则将该元素移到下一位 4.重复步骤3&#xff0c;直到找到已排序元素中小于等于tem的元素…...

vue学习9

1.文章分类页面-element-plus表格 基本架子-PageContainer封装 按需引入的彩蛋&#xff0c;components里面的内容都会自动注册 用el-card组件&#xff0c;里面使用插槽或具名插槽 文章分类渲染 & loading处理 序号&#xff1a; <el-table-column type"index"…...

TDengine 性能测试工具 taosBenchmark

简介工具获取运行 无参数模式命令行模式配置文件模式 命令行参数配置文件参数 通用配置参数写入配置参数 数据库相关超级表相关标签列与数据列写入行为相关 查询配置参数 执行指定查询语句查询超级表 订阅配置参数数据类型对照表 配置文件示例 写入 JSON 示例查询 JSON 示例订阅…...

【xdoj离散数学上机】T283

递归函数易错&#xff1a; 防止出现递归死循环&#xff01; 题目 题目&#xff1a;求诱导出的等价关系的关系矩阵 问题描述 给定有限集合上二元关系的关系矩阵&#xff0c;求由其诱导出的等价关系的关系矩阵。 输入格式 第一行输入n&#xff0c;表示矩阵为n阶方阵&#xff0c…...

Javaweb中,使用Servlet编写简单的接口

案例&#xff1a;网页提交用户名和密码信息&#xff0c;后端校验密码长度需在6-12位之间 后端部分 WebServlet("/valid") public class SimpleServlet extends HttpServlet{public void service(HttpServletRequest req, HttpServletResponse resp) throws IOExcepti…...

GESP5级语法知识(十):初级数论(三)

埃氏筛法&#xff1a; #include <iostream> using namespace std; const int N1e61; int pri[N]; void prime(int n){for(int i2;i*i<n;i){if(pri[i]0){ // 如果i为素数for(int jii;j<n;ji){pri[j]1; // 将i的倍数标记为合数}}} } int main(){int n;cin>>n;…...

“PEP 8: W292 no newline at end of file“报错 IntelliJ IDEA自动添加空行问题

"PEP 8: W292 no newline at end of file"报错 IntelliJ IDEA自动添加空行问题 在使用IntelliJ IDEA的过程中&#xff0c;经常会发现不管是对于代码文件或者纯文本文件&#xff0c;在保存时中会在文件末尾加上一个空行&#xff0c;提交GIT对比检查时&#xff0c;总是…...

ComfyUI工作流 FluxRedux基础换装

文章目录 FluxRedux基础换装SD模型Node节点工作流程效果展示开发与应用FluxRedux基础换装 该工作流的目标是实现服装换装功能,利用多种深度学习模型和图像处理技术,通过用户输入的服装图像和模特图像,生成逼真的换装效果图。整个工作流涵盖了从图像加载、模型编码、条件生成…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...