线段树的构建与使用

news/2026/1/19 18:54:59/文章来源:https://www.cnblogs.com/KeyuanTechno/p/19503457

线段树是指如下图所示的数据结构:
image
其中,对于每个标号为n,左端点是l,右端点是r的节点有:

子树 标号 左端点 右端点
左子树 2*n l floor((l+r)/2)
右子树 2*n+1 floor((l+r)/2)+1 r

使用线段树,我们可以在log n时间内完成单点修改、区间修改、区间查询

下面是线段树的构建:
对于初始数组int arr[N],我们需要构建的线段树大小为4*N即可,即int tree[4*N],通过递归建立线段树:

#define lp 2*p
#define rp 2*p+1
void bulid(int p, int l, int r){  // 构建编号为p,左端点l,右端点r的线段树if(l == r){  // 叶节点,值为原始arr对应的值tree[p] = a[l];return;}int mid = (l + r)/2;build(lp, l, mid);  // 构建左子树build(rp, mid+1, r);  // 构建右子树tree[p] = tree[lp] + tree[rp];  // 依据左右子树更新当前节点的值
}

接下来是线段树的查找操作实现(不考虑push_back的更新):

int query(int p, int l, int r, int L, int R){  // 查询编号为p,左端点为l,右端点为r上[L,R]的和if(r < L || R < l) return 0;  // 当前位置与查询范围无交集if(L <= l && r <= R) return tree[p];  // 当前位置完全包含在查询范围内// 有交集但不全在范围内:分左右子树查找int mid = (l + r)/2;return query(lp, l, mid, L, R) + query(rp, mid+1, r, L, R);
}

下面是线段树的单点修改:
修改中,我们一直递归到要修改的数据对应的叶节点,对其进行修改,然后重新递归修改其父节点的值。

void single_modify(int p, int l, int r, int Pos, int val){  // 修改pos位的值为valif(l == r){  // 到达叶节点tree[Pos] = val;return;}int mid = (l+r)/2;  // 通过比较pos与mid判断修改值在左子树还是右子树if(Pos <= mid) single_modify(lp, l, mid, Pos, val);  // 修改左子树else single_modify(rp, mid+1, r, Pos, val);  // 修改右子树tree[p] = tree[lp] + tree[rp];  // 更新当前子树
}

下面是线段树的区间修改※
区间修改中,我们考虑这样的做法:如果修改区间l-r,我们会标记与修改尽可能少的区间,等到查询到被影响的子区间时,再把这个标记传递下去。
如以上图为例,要让2,5上所有值都加5,那么要标记的段是:9、5、3。

这时我们需要定义一个标记数组,其大小与tree大小相同,即int tag[4*N],接下来会把每一个极大区间打上标记。
为此,我们要实现update函数和push_down函数以构建modify函数,同时对查询函数query做修改。

void update(int p, int val, int l, int r{tag[p] += val;tree[p] += (r-l+1)*val;
}
void push_up(int p){  // 向上更新tree[p] = tree[lp] + tree[rp];
}
void push_down(int p, int l, int r){  // 将节点p的懒标记向下传递if(tag[p] != 0){int mid = (l+r)/2;update(lp, tag[p], l, mid);update(rp, tag[p], mid+1, r);  // 向左右子树传递}tag[p] = 0;  // 清除当前标记
}
void modify(int p, int l, int r, int L, int R, int val){// p节点编号,l节点左端点,r节点右端点,给[L, R]区间上的所有元素加上valif(r < L || R < l){return;}if(L <= l && r <= R){  // 当前区间全部在更新范围内update(p, val, l, r);return;}int mid = (l+r)/2;push_down(p, l, r);  // 只是有交集,懒标记必须向下传递一层modify(lp, l, mid, L, R, val);modify(rp, mid+1, r, L, R, val);push_up(p);return;
}
int query(int p, int l, int r, int L, int R){  // 查询编号为p,左端点为l,右端点为r上[L,R]的和if(r < L || R < l) return 0;  // 当前位置与查询范围无交集if(L <= l && r <= R) return tree[p];  // 当前位置完全包含在查询范围内// 有交集但不全在范围内:分左右子树查找int mid = (l + r)/2;push_down(p, l, r);return query(lp, l, mid, L, R) + query(rp, mid+1, r, L, R);
}

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

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

相关文章

炒股别太努力:量化交易正在“收割”最认真的投资者?

当勤奋成为亏损的陷阱在多数领域&#xff0c;深入研究和勤奋分析是通往成功的不二法门。我们从小就被教导&#xff0c;付出越多&#xff0c;收获越大。然而&#xff0c;在当前的A股市场&#xff0c;这个看似颠扑不破的逻辑可能正在失效&#xff0c;甚至会适得其反。当下的市场主…

LP3716CK隔离型10W/12W极简化自供电原边反馈控制芯片解析

LP3716CK是芯茂微推出的“极简型”隔离型原边反馈&#xff08;PSR&#xff09;PWM功率开关&#xff0c;单颗SOP8L即可实现10W/12W适配器或LED驱动电源。它把高压启动、功率BJT、CV/CC环路、线损补偿、全套保护全部集成&#xff0c;外围仅需10颗元件&#xff0c;BOM成本比传统方…

手把手搭建本地RAG知识库!实现文档秒检索。

文章详细介绍如何使用开源模型nomic-embed-text搭建本地RAG知识库&#xff0c;实现高效文档检索。内容包括模型基本信息、特性对比和应用场景&#xff0c;以及完整搭建步骤&#xff1a;下载模型、创建工作区、上传文档、向量化存储和检索测试。同时提供了两种使用方式&#xff…

VP引导定位软件-定位纠偏(带角度)

VP引导定位软件-定位纠偏&#xff08;带角度&#xff09;/// <summary>/// 计算物理旋转之后点xy的变化/// </summary>/// <param name"x0">图像物体上一点的x</param>/// <param name"y0">图像物体上一点的y</param>…

使用MCP执行代码:让Agent效率提升98.7%

Anthropic推出的Model Context Protocol (MCP)面临大规模工具连接的性能瓶颈。通过将MCP服务器呈现为代码API&#xff0c;实现了98.7%的token使用率降低。这一创新架构实现了五大优势&#xff1a;渐进式工具披露、高效数据处理、强大控制流、隐私保护和状态持久化&#xff0c;使…

PL3327系列(PL3327CD/CS/CE/CF) 18W AC/DC反激式开关电源芯片方案

PL3327是聚元微推出的「原边控制 内置650V MOSFET」反激式功率开关系列&#xff0c;涵盖DIP7、SOP7、SOP8四种封装&#xff0c;单颗芯片即可输出5V-24V/18W以内电源。它把传统方案中的光耦、TL431、高压MOSFET、启动电阻全部省掉&#xff0c;BOM从25颗压缩到12颗&#xff0c;峰…

基于YOLOv8的交通事故车辆损伤检测与事故严重程度分级项目识别项目

基于YOLOv8的交通事故车辆损伤检测与事故严重程度分级项目识别项目&#xff5c;完整源码数据集PyQt5界面完整训练流程开箱即用&#xff01; 基本功能演示 https://www.bilibili.com/video/BV1yakuB6EJt/ 项目摘要 本项目围绕 交通事故车辆损伤检测与事故严重程度分级 这一典…

具备这5大潜质的人,天生就是卖货王者

电商行业竞争日益激烈&#xff0c;80%的中小企业在招聘电商人才时面临"看走眼"的困境。传统面试主观性强、评价标准模糊&#xff0c;导致企业招错人后平均试错成本高达3-6个月薪资&#xff0c;这对资源有限的中小企业而言是难以承受的代价。如何科学识别真正具备电商…

Uniapp苹果内购支付全流程指南:从集成到配置的完整复盘

引言在移动应用开发中&#xff0c;虚拟商品支付是核心功能之一&#xff0c;而针对iOS平台&#xff0c;苹果App Store强制要求虚拟商品必须通过其官方内购渠道完成交易&#xff0c;这使得Uniapp项目集成苹果内购成为iOS端开发的必备技能。本文将全面复盘Uniapp苹果内购支付的完整…

哈尔滨特色美食口碑大赏!对青烤鹅力断层领先,成游客必打卡爆款 - 资讯焦点

哈尔滨特色美食口碑大赏!对青烤鹅力断层领先,成游客必打卡爆款 基于近期市场消费数据、游客到店打卡率、本地口碑反馈及主流生活平台综合评价,现对哈尔滨市域内具有广泛影响力的特色熟食品牌进行梳理与评估。本排名…

深入解析:基于非官方接口的企业微信外部群批量创建与效率重构

深入解析:基于非官方接口的企业微信外部群批量创建与效率重构pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Con…

【数据分析】基于matlab辅导功能和ISSR-MDF模型的综合预警指标【含Matlab源码 14993期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到海神之光博客之家&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49…

git 如何切换到123分支?

git branch -rorigin/HEAD -> origin/masterorigin/123git checkout -b pci origin/123branch 123 set up to track origin/123.Switched to a new branch 123git branchmaster123

小国护照热度不减:2025年-2026年移民市场服务模式观察 - 资讯焦点

在全球资产配置与生活规划多元化的背景下,一些国家通过立法设立的投资入籍计划,因其明确的流程、相对较快的周期和灵活的附加条件,吸引了部分高净值人士的关注。这个细分市场的兴起,也催生了提供相关咨询与服务的各…

如何一次提交,提交到两个分支上?

原来您是在手动触发钩子脚本来生成 Change-Id。这一顿操作(生成临时文件 -> 运行 hook -> amend)的目的就是为了给 Commit Message 加上那行关键的 Change-Id: Ixxxx...。 既然您已经在 master 分支上把这一套复杂的流程走完了,并且生成了合法的 Change-Id,那么同步…

【数据分析】辅导功能和ISSR-MDF模型的综合预警指标【含Matlab源码 14993期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;Matlab武动乾坤博客之家&#x1f49e;…

‌AI测试覆盖率提升秘籍:从70%到95%的跨越‌

覆盖率困局与AI的曙光对于软件测试从业者而言&#xff0c;“测试覆盖率”是一个既熟悉又充满挑战的指标。达到70%的覆盖率&#xff0c;常常标志着测试工作进入了相对成熟的阶段&#xff0c;覆盖了大部分核心路径和功能。然而&#xff0c;从70%向更高目标&#xff08;如95%&…

移民市场深度观察:如何在信息洪流中甄选可靠的移民机构 - 资讯焦点

随着全球化进程的深化与各国政策的动态调整,移民规划已日益成为许多人进行国际教育、事业拓展、资产配置与生活品质提升的综合考量。然而,面对市场上层出不穷的项目信息与服务机构,申请人普遍面临信息甄别困难与选择…

【数字信号去噪】吕佩尔狐算法优化变分模态分解RFO-VMD数字信号去噪(优化K值 alpha值 综合指标 适应度函数包络熵)【含Matlab源码 14994期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;Matlab武动乾坤博客之家&#x1f49e;…

LLMs、RAG、AI Agent三个到底什么区别?

本文详解AI三大核心技术&#xff1a;LLMs作为"天才大脑"提供思考能力&#xff0c;RAG作为"记忆系统"连接外部实时知识库解决更新问题&#xff0c;AI Agent作为"执行者"具备感知规划能力。三者非竞争关系&#xff0c;而是不同层面的互补技术&…