线段树详解与实战应用
线段树是一种用于高效处理区间查询如区间求和、最值和区间更新操作的二叉树数据结构它将一个区间递归地划分为若干子区间进行管理使得单次操作的时间复杂度通常为 O(log n)。核心原理与结构线段树基于分治思想将区间[1, n]表示为一棵二叉树根节点存储整个区间[1, n]的统计信息如区间和。内部节点每个节点代表一个区间[l, r]。若l ! r则其左右子节点分别代表[l, mid]和[mid1, r]其中mid (l r) / 2。叶子节点代表长度为1的区间[i, i]直接存储原数组第i个元素的值。基本操作与代码实现以区间求和为例以下为 C 实现包含建树、区间查询、单点更新及使用懒惰标记的区间更新。#include vector #include iostream using namespace std; class SegmentTree { private: vectorint tree; // 线段树数组 vectorint lazy; // 懒惰标记数组 int n; // 原始数组大小 // 建树 void build(int node, int l, int r, const vectorint arr) { if (l r) { tree[node] arr[l]; return; } int mid (l r) / 2; build(node * 2, l, mid, arr); build(node * 2 1, mid 1, r, arr); tree[node] tree[node * 2] tree[node * 2 1]; // 合并左右子树信息 } // 下推懒惰标记 void pushDown(int node, int l, int r) { if (lazy[node] ! 0) { int mid (l r) / 2; // 更新子节点的值和懒惰标记 tree[node * 2] lazy[node] * (mid - l 1); lazy[node * 2] lazy[node]; tree[node * 2 1] lazy[node] * (r - mid); lazy[node * 2 1] lazy[node]; lazy[node] 0; // 清除当前节点的标记 } } // 区间查询 int query(int node, int l, int r, int ql, int qr) { if (ql l r qr) return tree[node]; // 当前区间完全在查询范围内 pushDown(node, l, r); // 查询前下推标记 int mid (l r) / 2; int sum 0; if (ql mid) sum query(node * 2, l, mid, ql, qr); if (qr mid) sum query(node * 2 1, mid 1, r, ql, qr); return sum; } // 单点更新 void updatePoint(int node, int l, int r, int idx, int val) { if (l r) { tree[node] val; return; } int mid (l r) / 2; if (idx mid) updatePoint(node * 2, l, mid, idx, val); else updatePoint(node * 2 1, mid 1, r, idx, val); tree[node] tree[node * 2] tree[node * 2 1]; // 更新父节点 } // 区间更新使用懒惰标记 void updateRange(int node, int l, int r, int ul, int ur, int val) { if (ul l r ur) { tree[node] val * (r - l 1); // 更新当前节点值 lazy[node] val; // 打上懒惰标记 return; } pushDown(node, l, r); // 下推现有标记 int mid (l r) / 2; if (ul mid) updateRange(node * 2, l, mid, ul, ur, val); if (ur mid) updateRange(node * 2 1, mid 1, r, ul, ur, val); tree[node] tree[node * 2] tree[node * 2 1]; // 合并子节点信息 } public: SegmentTree(const vectorint arr) { n arr.size()1; // 假设arr下标从1开始 tree.resize(4 * n); lazy.resize(4 * n, 0); build(1, 1, n, arr); } int queryRange(int l, int r) { return query(1, 1, n, l, r); } void updateSingle(int idx, int val) { updatePoint(1, 1, n, idx, val); } void updateRange(int l, int r, int val) { updateRange(1, 1, n, l, r, val); } }; // 使用示例 int main() { vectorint arr {0, 1, 3, 5, 7, 9, 11}; // arr[0]占位有效数据从下标1开始 SegmentTree st(arr); cout 区间[2,5]的和: st.queryRange(2, 5) endl; // 输出: 24 (3579) st.updateSingle(3, 10); // 将下标3的元素改为10 cout 更新后区间[2,5]的和: st.queryRange(2, 5) endl; // 输出: 29 (31079) st.updateRange(2, 4, 2); // 区间[2,4]每个元素加2 cout 区间更新后[2,5]的和: st.queryRange(2, 5) endl; // 输出: 35 (51299) return 0; }关键特性与对比特性描述时间复杂度区间查询查询任意区间[l, r]的聚合信息和、最值等O(log n)单点更新修改原数组中单个元素的值O(log n)区间更新配合懒惰标记 (Lazy Propagation)可高效地对整个区间进行统一修改如区间加一个值O(log n)空间复杂度通常需要 4*n 的数组存储树节点最坏情况O(n)适用场景频繁的区间查询、区间更新操作原数组规模大需要优于 O(n) 的复杂度-常见变体与应用场景区间最值线段树将合并操作从求和改为求最大值或最小值常用于 RMQRange Minimum Query问题 。染色问题线段树每个节点可记录区间颜色状态用于处理区间覆盖与颜色种类查询 。可持久化线段树主席树通过复用历史版本的节点支持查询任意历史版本的信息常用于区间第 K 大问题 。动态开点线段树在节点被访问时才创建适用于值域极大如[1, 1e9]但实际使用点稀疏的场景。权值线段树将值域作为区间统计值的出现次数可用于解决逆序对、排名等问题。核心优化懒惰标记 (Lazy Tag)懒惰标记是线段树支持高效区间更新的关键。其核心思想是当更新完全覆盖某个节点区间时仅更新该节点的值并打上标记表示其子节点有待更新而非立即递归更新所有子节点。只有当后续查询或更新需要访问子节点时才将标记下推pushDown。这避免了不必要的递归将区间更新的复杂度从 O(n) 降为 O(log n)。参考来源HDU5023线段树应用于染色问题【数据结构】可持久化线段树图解原理逻辑及版本实现细节洛谷 P3919 C代码数据结构学习——线段树的C语言实现线段树详解含代码实现经过测试线段树segment tree)看这一篇就够了

相关新闻

地图瓦片XYZ下载(免费)(QGIS)

地图瓦片XYZ下载(免费)(QGIS)

本次教程只展示如何下载xyz切片瓦片下载,包括下载链接与示例 1、使用免费的QGIS长期支持版LTR 2、安装好后修改QGIS语言为中文,菜单 Settings → Options → Locale 3、添加高德矢量底图地图API,在XYZ切片右击->输入高德电子矢量->输入…

2026/7/18 16:23:44阅读更多 →
解密中兴光猫配置的终极指南:免费开源工具完全解析

解密中兴光猫配置的终极指南:免费开源工具完全解析

解密中兴光猫配置的终极指南:免费开源工具完全解析 【免费下载链接】ZET-Optical-Network-Terminal-Decoder 项目地址: https://gitcode.com/gh_mirrors/ze/ZET-Optical-Network-Terminal-Decoder 你是否曾因无法读取中兴光猫配置文件而束手无策&#xff1f…

2026/7/18 16:23:44阅读更多 →
照片换背景底色怎么做?手机/在线免费工具/PS详细实操教程

照片换背景底色怎么做?手机/在线免费工具/PS详细实操教程

日常处理证件照、人像写真、产品素材时,更换照片背景底色是高频需求。不同使用场景对应的工具和操作方式差异较大,临时快速出图适合轻量化免费工具,追求高清精细效果则需要专业软件操作。本文整合2026年主流的照片换底色方法,涵盖…

2026/7/18 16:23:44阅读更多 →
# 餐饮老板避坑指南:3家靠谱油水分离器服务商实测,附选型实操攻略开餐饮店的老板都懂,油水分离器是后厨的“刚需装备”—

# 餐饮老板避坑指南:3家靠谱油水分离器服务商实测,附选型实操攻略开餐饮店的老板都懂,油水分离器是后厨的“刚需装备”—

开餐饮店的老板都懂,油水分离器是后厨的“刚需装备”——既关乎环保合规,又能避免下水道堵塞、异味扰民。但选服务商却成了不少人的头疼事:怕选到资质不全的过不了环保检查,怕售后跟不上耽误营业,怕设备不合用白花钱。…

2026/7/18 17:19:48阅读更多 →
中美机器人发展路径对比:从春晚机器人拆解看技术路线差异

中美机器人发展路径对比:从春晚机器人拆解看技术路线差异

1. 项目概述:从一台春晚机器人说起前阵子,我花了差不多二十万,买了一台在春晚上亮相过的人形机器人。这事儿在圈子里传开,不少朋友都来问我体验如何。说实话,刚拿到手那会儿,心情是复杂的,既有对…

2026/7/18 17:19:48阅读更多 →
Python股票量化实战:完整复刻通达信ENE轨道线指标计算

Python股票量化实战:完整复刻通达信ENE轨道线指标计算

前言 做A股波段交易的朋友基本都接触过ENE轨道线,对比布林带,ENE参数固定、震荡区间判断更贴合国内个股走势,专门用来做高抛低吸、识别趋势突破。 网上很多Python实现ENE的代码存在致命错误:误用EMA指数均线代替MA简单均线&#x…

2026/7/18 17:19:48阅读更多 →
Sprint计划管理工具实践:如何提升敏捷迭代计划与执行效率

Sprint计划管理工具实践:如何提升敏捷迭代计划与执行效率

引言:为什么 Sprint 计划总能按时制定,却很难按计划完成?在敏捷开发团队中,Sprint 计划几乎是每个迭代开始前都会进行的重要工作。团队评估需求、拆解任务、预估工时、确认目标,希望在接下来的两周或一个月内完成既定工…

2026/7/18 17:19:48阅读更多 →
Flutter+iOS平台第三方登录集成实战与优化

Flutter+iOS平台第三方登录集成实战与优化

1. 项目概述:FlutteriOS平台第三方登录集成实战 在移动应用开发中,第三方登录已经成为提升用户注册转化率的标准配置。最近在为一个跨境电商项目集成Line、Google和Facebook登录时,我发现Flutter官方文档对iOS平台的配置说明存在多处细节缺失…

2026/7/18 17:19:48阅读更多 →
卧槽!!!一觉起来国产模型干翻Fable5了

卧槽!!!一觉起来国产模型干翻Fable5了

Kimi K3 深度解析:2.8 万亿参数的开源巨兽,凭什么在竞技场登顶?2026 年 7 月 16 日,月之暗面(Moonshot AI)发布新一代开源旗舰模型 Kimi K3。2.8 万亿参数、100 万 Token 上下文、原生视觉理解——它不只是…

2026/7/18 17:17:48阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/18 10:49:13阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/18 8:49:08阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/18 14:49:24阅读更多 →
从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则

从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则

更多请点击: https://kaifayun.com 第一章:从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则 在Claude驱动的产品需求文档(PRD)生成实践中,原始业务意图往往以自然语言片…

2026/7/18 0:00:14阅读更多 →
Cursor配置生成失效?3大隐藏陷阱+4行修复代码,资深工程师连夜整理的紧急补救清单

Cursor配置生成失效?3大隐藏陷阱+4行修复代码,资深工程师连夜整理的紧急补救清单

更多请点击: https://codechina.net 第一章:Cursor配置生成失效?3大隐藏陷阱4行修复代码,资深工程师连夜整理的紧急补救清单 Cursor 配置生成突然失效,是近期高频报障场景。表面看是 cursor.config.json 未更新或 LSP…

2026/7/18 0:00:14阅读更多 →
某智驾大牛创业

某智驾大牛创业

作者:钟声编辑:Mark出品:红色星际头图:智能驾驶图片据悉,国内某头部智驾公司端到端模型技术大牛Z投身创业,并且已经拿到融资。Z不仅是该头部公司内部最年轻的对标阿里P10级别技术负责⼈,更是业内…

2026/7/18 0:00:14阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/17 22:48:46阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/18 14:49:24阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/17 17:26:50阅读更多 →