GLFLS课程:线段树进阶

news/2024/10/6 19:08:16/文章来源:https://www.cnblogs.com/qianxiquq/p/18287029

线段树合并与分裂

线段树合并

两个权值线段树 \(T_1\)\(T_2\) 的合并是一个递归的过程。我们不妨设要合并的子树为 \(x\)\(y\),其对应区间均为 \([l,\ r]\) 那么分类讨论如下:

  \((1)\) 首先若 \(x = 0\)\(y = 0\),则 \(x\)\(y\) 中有空节点,直接返回 \(x + y\) 即可。

  \((2)\) 再将 \(x,\ y\) 的左和右儿子分别合并,令合并后的节点编号分别为 \(p,\ q\)

  \((3)\)\(y\) 的左儿子设为 \(p\),右儿子设为 \(q\),完成合并。返回 \(y\)

特别的,当 \(x\)\(y\) 为叶子时,直接合并信息。在合并过程中,需要实时 pushdown/spreadpushup

线段树合并的时间复杂度与删去的节点数同级。

\(Code:\)

int merge(int x, int y, int pl, int pr){if(!x || !y) return x | y; // or x + yif(pl == pr){tree[y].sum += tree[x].sum;return y;}int mid = (pl + pr) / 2;tree[y].ls = merge(tree[x].ls, tree[y].ls, pl, mid), tree[y].rs = merge(tree[x].rs, tree[y].rs, mid + 1, pr);pushup(y);return y;// Due to single update, pushdown isn't required.// If your func isn't a single update one, DO remember to pushdown!
}

\(Template: P4556.\)

线段树维护区间最值和历史最大值

经典例题:Gorgeous Sequence (hdu 5306)

一个长度为 \(n\) 的序列 \(a\), 做 \(m\) 次操作,操作有以下 3 种:
$0\ L\ R\ x $ 即对于 \([L,\ R]\) 区间内的每个 \(a_i\), 用 \(min(a_i,\ x)\) 替换;
\(1\ L\ R\) 即输出 \([L,\ R]\) 区间内的最大值 \(a_i\)
\(2\ L\ R\) 即输出 \([L,\ R]\) 区间内所有 \(a_i\) 的和。

对于线段树的每一个节点,我们需要定义标记:区间和 sum, 区间最大值 maxn, 最大值个数 num严格次大值 submaxn

做区间最值的第 0 种修改操作, 用 min(a[i], x) 替换区间 \([L,\ R]\) 中的每一个 \(a_i\)

我们对区间的每一个节点进行剪枝搜索,对于某个节点,我们分以下3类进行讨论:

  \((1)\) 当 $maxn \le x $ 时,这次不产生修改,退出。

  \((2)\)\(submaxn < x < maxn\) 时,这次修改会影响最大值,更新 sum = sum - t(maxn - x)maxn = x,打上 lazy_tag 后退出。

  \((3)\)\(submaxn \ge x\) 时,无法直接更新,只能递归其左右儿子。

01:48:57

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/740776.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vulnhub - JIS-CTF

泡面机vulnhub - JIS-CTF 这个靶场一共有5个flag 信息收集 靶机ip:192.168.157.172 kali ip:192.168.157.161 nmap 192.168.157.0/24 nmap -sT --min-rate 10000 -p- 192.168.157.172 sudo nmap -sT -sV -sC -O -p22,80 192.168.157.172一眼看到robots.txt User-agent: * Dis…

暑假进度表

7.8 个人赛打的还可以,就是F题敲得太慢了,最后差十分钟做出来。 补了一个重要但是原来没注意到的一个知识点 \(01bfs\) ,做了四道相关题,将F题写进了双端队列的内容中,感觉非常不错的一题。

私有云盘-可道云-安装和使用和数据迁移

私有云盘是什么 随着云计算和移动办公大潮的到来,iPad、智能手机等家庭联网设备不断增多,以及搭载小容量SSD笔记本电脑的流行,能够跨平台分享的个人云服务需求不断增长;而今天的个人云服务也已经极大丰富,从2TB的百度网盘到商务人士中流行的Dropbox和Box个人云,不但免费,…

比赛获奖的武林秘籍:04 电子类比赛嵌入式开发快速必看的上手指南

本文主要介绍了电子类比赛中负责嵌入式开发同学的上手比赛的步骤、开发项目的流程和具体需要学习的内容,并结合自身比赛经历给出了相关建议。比赛获奖的武林秘籍:04 电子类比赛嵌入式开发快速必看的上手指南 摘要 本文主要介绍了电子类比赛中负责嵌入式开发同学的上手比赛的步…

线程饥饿问题——b2b - Thread starvation or clock leap detected (housekeeper delta=5h28m19s393ms972......

原因:在方法上配置了 @Async 注解进行异步执行,但是没有在主配置类上配置 @EnableAsync 启动异步执行。 修改前 修改后

SpringBoot项目启动,运行停留在标题处

详情: 原因:yml文件存在问题,比如:在切换生产环境和开发环境的配置文件时,yml名称写错,如下,图,此处多写了一个p。解决办法:修改为正确的配置文件,即可。

git合并代码方法

你合并代码用 merge 还是用 rebase ? macrozheng 2024年07月08日 14:10 江苏 1人听过以下文章来源于古时的风筝 ,作者风筝古时的风筝. 写代码是一种爱好,写文章是一种情怀。mall学习教程官网:macrozheng.com 你们平时合并代码的时候用 merge 还是 rebase? 我问了一圈,发现…

秒杀圣经(2):10Wqps秒杀,16大架构绝招,一文帮你秒变架构师

文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备 免费赠送 :《尼恩技术圣经+高并发系列PDF》 ,帮你 实现技术自由,…

写入多维表格失败

原因一: 没有获取到正确的table_id 解决办法将多维表格在浏览器打开,url的这部分就是table_id,如下图。由于模板中的设置多维表格模块需要输入网址,所以建议将网址和table_id一起复制

【算法篇】KMP算法,一种高效的字符串匹配算法

我们今天了解一个字符串匹配算法-KMP算法,内容难度相对来说较高,建议先收藏再细品!!! KMP算法我们今天了解一个字符串匹配算法-KMP算法,内容难度相对来说较高,建议先收藏再细品!!!KMP算法的基本概念 KMP算法是一种高效的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.…

飞书集成平台,流程触发器触发,没有运行日志

原因:飞书平台自动关联自建应用时,回调地址生成存在问题。解决办法:将飞书的触发器回调地址的内容,复制到关联的自建应用的事件回调地址中

NOIP2024模拟1

NOIP2024模拟1\(T1\) GHzoj 3752. 分糖果 \(100pts\)设最终答案中有 \(a\) 个小组中的小朋友的糖数 \(\mod 3\) 均等于 \(1\) , \(b\) 个小组中的小朋友的糖数 \(\mod 3\) 互不相等, \(c\) 个小组中的小朋友的糖数 \(\mod 3\) 均等于 \(0\) , \(d\) 个小组中的小朋友的糖数 …