线段树合并三十天:从入门到放弃

2023-10-20 11:10

本文主要是介绍线段树合并三十天:从入门到放弃,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

线段树合并

  • 前言
  • 一、前置知识
  • 二、线段树合并简介
  • 三、时间复杂度
  • 四、用处
  • 五、例题

前言

由于各种原因,我的博客已经有一个月没有更新了。今天,我来写一片博客:能把你弄崩溃的 线段树合并 \Huge\color{red}\text{线段树合并} 线段树合并

一、前置知识

  • 动态开点线段树
  • 权值线段树

如果不会的我没法帮你

二、线段树合并简介

线段树合并,就是建立一棵新的线段树保存原有的两颗线段树的信息。

图片来源于某人的线段树合并讲义

一波凌云踏步再加一个托马斯回旋非常漂亮!

但是!咋做呢?

别急,我来给你讲讲看

  1. 如果a有pos位置,b没有,那么新的线段树pos位置赋成a,返回
  2. 如果b有pos位置,a没有,赋成b,返回
  3. 如果此时已经合并到两棵线段树的叶子节点了,就把b在pos的值加到a上,把新线段树上的pos位置赋成a
  4. 递归处理左子树
  5. 递归处理右子树
  6. 用左右子树的值更新当前节点
  7. 将新线段树上的pos位置赋成a

是不是很懵逼?别急,我来给你一个example:

假设一个线段树为:

1
2
3
4
NULL

而另一个线段树为

1
2
NULL
3
4

则他们合并起来则是:

2
4
3
7
4

代码:

int merge(int a,int b,int l,int r)
{if(!a) return b;if(!b) return a;if(l==r){return a;}int mid=(l+r)>>1;tr[a].l=merge(tr[a].l,tr[b].l,l,mid);tr[a].r=merge(tr[a].r,tr[b].r,mid+1,r);push_up(a);return a;
}

妙啊!

三、时间复杂度

我最害怕的就是计算时间复杂度惹!
——某位巨佬

关于时间复杂度好不好算,有一个公式:

【数据删除】(我不会

不过可以看这位dalao的blog

首先我们需要知道动态开点线段树中插入一个点会加入多少个新的节点?
线段树从顶端到任意一个叶子结点之间有 log ⁡ n \log n logn层,每层最多新增一个节点。
所以插入一个新的点复杂度是 log ⁡ n \log n logn的。

两棵线段树合并的复杂度显然取决于两棵线段树重合的叶子节点个数,假设有 m m m个重合的点,这两棵线段树合并的复杂度就是 m log ⁡ n m\log n mlogn了,所以说,如果要合并两棵满满的线段树,这个复杂度绝对是远大于 log ⁡ n \log n logn级别的。
也就是说,千万不要以为线段树合并对于任何情况都是 log ⁡ n \log n logn的!

别崩溃,因为它一均摊, 1 0 5 10^5 105至少能过

四、用处

这玩意有啥用呢?这个玩意可以处理一些用其他数据结构不好处理的子树问题
你对每个点开一棵线段树然后能维护的东西,线段树合并都能维护,因为他们的本质是一样的。

五、例题

CF600E

大意:

给你一棵有 n n n个点的树 n ≤ 1 0 5 n\leq10^5 n105,树上每个节点都有一种颜色 c i , c i ≤ n c_i,c_i\leq n ci,cin,让你求每个点子树出现最多的颜色/编号的和

洛谷P4556

洛谷P3224

洛谷P1600

CF666E

这篇关于线段树合并三十天:从入门到放弃的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/246709

相关文章

MySQL DQL从入门到精通

《MySQLDQL从入门到精通》通过DQL,我们可以从数据库中检索出所需的数据,进行各种复杂的数据分析和处理,本文将深入探讨MySQLDQL的各个方面,帮助你全面掌握这一重要技能,感兴趣的朋友跟随小... 目录一、DQL 基础:SELECT 语句入门二、数据过滤:WHERE 子句的使用三、结果排序:ORDE

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

Python中合并列表(list)的六种方法小结

《Python中合并列表(list)的六种方法小结》本文主要介绍了Python中合并列表(list)的六种方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录一、直接用 + 合并列表二、用 extend() js方法三、用 zip() 函数交叉合并四、用

利用Python实现Excel文件智能合并工具

《利用Python实现Excel文件智能合并工具》有时候,我们需要将多个Excel文件按照特定顺序合并成一个文件,这样可以更方便地进行后续的数据处理和分析,下面我们看看如何使用Python实现Exce... 目录运行结果为什么需要这个工具技术实现工具的核心功能代码解析使用示例工具优化与扩展有时候,我们需要将

Python实现获取带合并单元格的表格数据

《Python实现获取带合并单元格的表格数据》由于在日常运维中经常出现一些合并单元格的表格,如果要获取数据比较麻烦,所以本文我们就来聊聊如何使用Python实现获取带合并单元格的表格数据吧... 由于在日常运维中经常出现一些合并单元格的表格,如果要获取数据比较麻烦,现将将封装成类,并通过调用list_exc

POI从入门到实战轻松完成EasyExcel使用及Excel导入导出功能

《POI从入门到实战轻松完成EasyExcel使用及Excel导入导出功能》ApachePOI是一个流行的Java库,用于处理MicrosoftOffice格式文件,提供丰富API来创建、读取和修改O... 目录前言:Apache POIEasyPoiEasyExcel一、EasyExcel1.1、核心特性

Python中模块graphviz使用入门

《Python中模块graphviz使用入门》graphviz是一个用于创建和操作图形的Python库,本文主要介绍了Python中模块graphviz使用入门,具有一定的参考价值,感兴趣的可以了解一... 目录1.安装2. 基本用法2.1 输出图像格式2.2 图像style设置2.3 属性2.4 子图和聚

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python实现合并与拆分多个PDF文档中的指定页

《Python实现合并与拆分多个PDF文档中的指定页》这篇文章主要为大家详细介绍了如何使用Python实现将多个PDF文档中的指定页合并生成新的PDF以及拆分PDF,感兴趣的小伙伴可以参考一下... 安装所需要的库pip install PyPDF2 -i https://pypi.tuna.tsingh

Python FastAPI入门安装使用

《PythonFastAPI入门安装使用》FastAPI是一个现代、快速的PythonWeb框架,用于构建API,它基于Python3.6+的类型提示特性,使得代码更加简洁且易于绶护,这篇文章主要介... 目录第一节:FastAPI入门一、FastAPI框架介绍什么是ASGI服务(WSGI)二、FastAP