C++怎么实现一个线段树数据结构_C++算法竞赛与区间查询问题


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

c++怎么实现一个线段树数据结构_c++算法竞赛与区间查询问题

线段树是一种高效处理区间查询区间更新的数据结构,常用于算法竞赛中解决如区间求和、区间最值、区间更新等问题。它通过将区间递归划分成多个子区间,构建一棵二叉树,实现 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& arr) { n = arr.size(); tree.resize(4 * n); build(arr, 1, 0, n - 1); }

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

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.