0

0

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

冰火之心

冰火之心

发布时间:2025-11-21 15:27:01

|

574人浏览过

|

来源于php中文网

原创

线段树通过递归分治构建二叉树,实现区间求和、最值等操作的高效查询与更新。每个节点代表区间[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 防止越界。

实现区间求和线段树

以下是一个支持区间求和与单点修改的线段树实现:

立即学习C++免费学习笔记(深入)”;

#include 
#include 
using namespace std;

class SegmentTree { private: vector tree; // 存储线段树节点值 int n; // 原数组长度

void build(const vectorzuojiankuohaophpcnintyoujiankuohaophpcn& 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 zuojiankuohaophpcn= 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 zuojiankuohaophpcn l || ql youjiankuohaophpcn r) return 0;
    if (ql zuojiankuohaophpcn= l && r zuojiankuohaophpcn= 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);
}

};

Magic Eraser
Magic Eraser

AI移除图片中不想要的物体

下载

使用示例与常见扩展

使用上面的类非常简单:

int main() {
    vector arr = {1, 3, 5, 7, 9, 11};
    SegmentTree st(arr);
cout zuojiankuohaophpcnzuojiankuohaophpcn st.query(1, 3) zuojiankuohaophpcnzuojiankuohaophpcn endl;  // 输出 3+5+7 = 15
st.update(2, 10);                 // 把索引2的值改为10
cout zuojiankuohaophpcnzuojiankuohaophpcn st.query(1, 3) zuojiankuohaophpcnzuojiankuohaophpcn endl;  // 输出 3+10+7 = 20

return 0;

}

若要支持区间更新(如区间加法),需引入懒标记(lazy propagation),在节点上维护一个延迟更新值,避免每次都下传更新。

线段树还可扩展为维护最大值、最小值、异或和等,只需修改合并逻辑(tree[node] = max(left, right) 等)。

基本上就这些。掌握建树、查询、更新三个核心操作,就能应对大多数区间问题。线段树写起来有一定模板性,多练几次就能熟练。关键是理解递归分治的思想和区间覆盖的判断逻辑。

相关专题

更多
c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

519

2023.09.20

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

312

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

521

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

48

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

188

2025.08.29

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

529

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

5

2025.12.22

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

387

2023.08.14

桌面文件位置介绍
桌面文件位置介绍

本专题整合了桌面文件相关教程,阅读专题下面的文章了解更多内容。

0

2025.12.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 5.6万人学习

C 教程
C 教程

共75课时 | 3.8万人学习

C++教程
C++教程

共115课时 | 10.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号