线段树通过递归分治构建二叉树,实现区间求和、最值等操作的高效查询与更新。每个节点代表区间[l, r]并存储聚合信息,叶子节点对应原数组元素,非叶子节点合并子节点结果。常用数组模拟存储,根节点索引为1,左右子节点分别为2i和2i+1,空间一般开4*n。建树、单点更新、区间查询时间复杂度均为O(log n)。支持区间更新时需引入懒标记(lazy propagation)延迟下传修改,提升效率。可扩展维护最大值、最小值、异或和等,核心在于修改合并逻辑。掌握递归建树、区间覆盖判断与分治查询是关键。

线段树是一种高效处理区间查询和区间更新的数据结构,常用于算法竞赛中解决如区间求和、区间最值、区间更新等问题。它通过将区间递归划分成多个子区间,构建一棵二叉树,实现 O(log n) 的查询与更新效率。
线段树是一棵二叉树,每个节点代表一个区间 [l, r],存储该区间内某个聚合信息(如和、最大值等)。叶子节点对应原数组的单个元素,非叶子节点是其左右子节点的信息合并结果。
对于长度为 n 的数组,线段树通常用数组模拟,根节点在索引 1,左子节点为 2*i,右子节点为 2*i+1。总空间建议开 4*n 防止越界。
以下是一个支持区间求和与单点修改的线段树实现:
#include <iostream>
#include <vector>
using namespace std;
<p>class SegmentTree {
private:
vector<int> tree; // 存储线段树节点值
int n; // 原数组长度</p><pre class='brush:php;toolbar:false;'>void build(const vector<int>& arr, int node, int l, int r) {
if (l == r) {
tree[node] = arr[l];
return;
}
int mid = (l + r) / 2;
build(arr, node * 2, l, mid);
build(arr, node * 2 + 1, mid + 1, r);
tree[node] = tree[node * 2] + tree[node * 2 + 1];
}
void update(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)
update(node * 2, l, mid, idx, val);
else
update(node * 2 + 1, mid + 1, r, idx, val);
tree[node] = tree[node * 2] + tree[node * 2 + 1];
}
int query(int node, int l, int r, int ql, int qr) {
if (qr < l || ql > r) return 0;
if (ql <= l && r <= qr) return tree[node];
int mid = (l + r) / 2;
return query(node * 2, l, mid, ql, qr) +
query(node * 2 + 1, mid + 1, r, ql, qr);
}public:
SegmentTree(const vector
void update(int idx, int val) {
update(1, 0, n - 1, idx, val);
}
int query(int l, int r) {
return query(1, 0, n - 1, l, r);
}};
使用上面的类非常简单:
会译·对照式翻译
会译是一款AI智能翻译浏览器插件,支持多语种对照式翻译
79
查看详情
int main() {
vector<int> arr = {1, 3, 5, 7, 9, 11};
SegmentTree st(arr);
<pre class='brush:php;toolbar:false;'>cout << st.query(1, 3) << endl; // 输出 3+5+7 = 15
st.update(2, 10); // 把索引2的值改为10
cout << st.query(1, 3) << endl; // 输出 3+10+7 = 20
return 0;}
若要支持区间更新(如区间加法),需引入懒标记(lazy propagation),在节点上维护一个延迟更新值,避免每次都下传更新。
线段树还可扩展为维护最大值、最小值、异或和等,只需修改合并逻辑(tree[node] = max(left, right) 等)。
基本上就这些。掌握建树、查询、更新三个核心操作,就能应对大多数区间问题。线段树写起来有一定模板性,多练几次就能熟练。关键是理解递归分治的思想和区间覆盖的判断逻辑。
以上就是C++怎么实现一个线段树数据结构_C++算法竞赛与区间查询问题的详细内容,更多请关注其它相关文章!
# 线段树
# c++
# 数据结构
# 递归
# stream
# ios
# ai
# node
# 网站信息建设下步工作
# 绿植行业如何推广营销
# 山东企业网站建设语言
# 阜新网站建设排名套餐
# 网站制作营销推广
# wb刷粉网站推广
# 谷歌seo网络推广培训
# 肇庆网站建设费用明细
# 关于网站建设代理商
# seo 推广黑帽
# 是一个
# 如何实现
# 如何使用
# 二叉树
# 一棵
# 就能
# 单点
# 多核
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
AO3官方镜像链接 | 最新防走失网址永久收藏
基于 Flink 和 Kafka 实现高效流处理:连续查询与时间窗口
海棠阅读登录教程_详细讲解海棠登录操作
铁路12306怎么申请退票_铁路12306退票申请操作流程
SQLAlchemy 2.0 与 Pydantic 模型类型安全集成指南
Python中对象引用与链表属性赋值的机制解析
263企业邮箱如何设置邮件转发功能
PHP安全加载非公开目录图片与动态内容类型处理指南
获取WooCommerce产品在后台编辑页面的分类ID
修复UI元素交互障碍:从“开始”按钮到信息框的平滑过渡实现
手机雨课堂网页版入口免登录 雨课堂网页版可点击直接进入
PHP与SQL实践:高效实现数据复制与特定列值修改
漫蛙app官方版手机正版入口-漫蛙漫画manwa在线漫画正版入口
mysql怎么导入sql文件_mysql导入sql文件的方法与技巧
PPT页面尺寸怎么修改 PPT自定义幻灯片大小与方向设置【教程】
咸鱼怎么设置仅粉丝可见的动态_咸鱼动态粉丝可见设置方法
疯狂小鸟微信小游戏入口 疯狂小鸟网页版秒玩
《领英》查看屏蔽名单方法
msn官方入口2025登录 msn官网2025直达首页入口
mysql镜像配置如何恢复数据_mysql镜像配置数据恢复详细流程
Linux如何优化系统启动流程_Linux启动项优化方案
海棠阅读网页版_进入海棠网页版在线阅读中心
《漫蛙manwa2》防走失网页版链接2025
PointNet++语义分割模型中类别变更引发的断言错误及标签处理策略
C#解析来自网络的XML流数据 实时错误处理与重试机制
《via浏览器》强制缩放网页设置方法
火柴人战争网页版在线玩
可米酷漫画在线阅读入口_ 可米酷漫画官网直达链接
自定义你的VS Code状态栏,监控关键信息
windows server2019显卡驱动怎么安装_winserver2019显卡驱动安装与远程桌面优化
百度竞价WAP显示PC链接问题
AO3中文入口稳定分享_AO3官网HTTPS看文详解
《梦想世界:长风问剑录》药师一图流分享
mysql中如何分析索引使用情况_mysql索引使用分析方法
《华夏千秋》龙女试炼功法获取方法
鲨鱼剧场app金币获取方法
《绿竹漫游》关闭消息通知方法
手机耗电快是什么原因 延长手机电池续航时间的设置方法【详解】
支付宝网页版在线入口 支付宝官网电脑登录入口
《随手记》启用语音备注方法
2025考研成绩查询时间入口分享
餐馆菜篮选购指南
windows10怎么更改下载路径_windows10默认存储位置修改教程
ExcelSCAN与LAMBDA如何创建自定义移动平均函数_SCAN实现任意窗口期移动平均计算
Golang中的rune与byte类型区别是什么_Golang字符与字节处理详解
向往的生活小游戏启动处_向往的生活小游戏立即启动
Safari浏览器自动填表功能失效怎么办 Safari表单管理修复
抖音小程序怎么开通?小程序开通条件是什么?
QQ邮箱手机版网页版 QQ邮箱登录入口地址
Lar*el 关联查询:同时筛选父表与子表数据的高效策略
2025-11-21
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。