线段树通过递归分治构建二叉树,实现区间求和、最值等操作的高效查询与更新。每个节点代表区间[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 】
相关推荐:
b站如何剪辑视频_b站必剪app使用教程
谷歌邮箱怎么换绑定邮箱Gmail安全备份邮箱修改方法
包子漫画在线观看入口 包子漫画网正版全集链接
PDF如何批量加注释_PDF多文件批注高亮操作教程
mysql镜像配置如何恢复数据_mysql镜像配置数据恢复详细流程
word怎么将图片设置为页面背景并不影响打印_Word图片背景设置方法
折叠屏手机充不进电是什么问题? 特殊结构带来的维修难点
iQOO手机信号差网络不稳定怎么办 信号问题原因排查与增强设置【攻略】
泰拉瑞亚网页版在线登录入口 泰拉瑞亚官方正版入口
抖音视频如何添加标题?添加标题有哪些好处?
J*aScript:从子元素中批量移除特定CSS类
《荔枝fm》导出文件教程
多闪电脑版下载_多闪PC端模拟器使用
漫蛙manwa官网浏览入口_漫蛙漫画网页版访问链接
更换小红书群背景怎么换?小红书群规则怎么设置?
Yandex俄罗斯搜索引擎官网入口 Yandex网页端直接访问
什么是Satis,如何用它搭建一个私有的composer仓库?
Vue 3中独立响应式实例的创建与应用
支付宝如何解绑云闪付_支付宝与云闪付账户关联解除方法
Golang如何初始化module项目_Golang module init使用说明
《友玩*》创建群聊方法
网站体验不好=浪费钱:如何提升-用户体验效果差
使用document.execCommand实现Web文本编辑器加粗/取消加粗
《七读免费小说》开通会员方法
如何用mysql实现客户反馈管理_mysql客户反馈数据库方法
《下一站江湖2》风神腿获取攻略
《淘票票》添加到苹果钱包教程
一加 Ace 6V 快充无法启用_一加 Ace 6V 充电优化
德邦快递查询入口登录官网 德邦快递单号查询系统入口
手机自动关机是怎么回事?如何修复?手机异常关机的原因排查与修复技巧
使用逻辑应用(Logic Apps)自动处理邮件附件中的XML到Excel
《搜书吧》阅读书籍方法
poki官网最新入口 poki小游戏大全入口
POKI小游戏在线免费入口链接 POKI小游戏无下载秒玩玩
J*aScript中高效处理用户输入:从Keyup事件到表单提交的优化实践
英雄联盟争者留名活动介绍
word表格如何按某一列内容进行排序_Word表格按列排序方法
鲨鱼剧场app金币获取方法
知乎APP怎么查看自己被邀请的问题_知乎APP邀请回答记录查看与参与方法
汽水音乐官网网页版入口 汽水音乐官网网页版在线入口
J*a列表元素格式化输出教程
Python csv 模块处理非字符串数据:列表写入 CSV 文件的机制解析
抖音如何解除|直播|权限绑定_抖音关闭并解绑|直播|功能的方法
虫虫漫画排行榜单入口_虫虫漫画编辑推荐入口
天天漫画2025最新入口 天天漫画永久有效登录入口
2025考研成绩查询时间入口分享
哔哩哔哩在线观看入口 B站官网免费进入
PHP魔术方法__set与__isset:设计考量、性能权衡与静态分析的视角
C++如何将字符串转换为大写或小写_C++ transform函数的使用技巧
VBA Outlook邮件自动化:高效集成Excel数据与列标题的策略
2025-11-21
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。