数据结构:线段树代码详解

简介: 数据结构:线段树代码详解

线段树支持的操作有:单点修改、区间查询。

类设计

一个线段树的结点包含3个元素:该区间左端点、该区间右端点、该区间维护的数值。

例如:

struct Tr{
  int l,r,w;
};
Tr tr[N*4];

建树


image.png

void build(int u,int l,int r){
  tr[u]={l,r};
  if (l==r)
    return;
  int mid=l+r>>1;
  build(u<<1,l,mid);
  build(u<<1|1,mid+1,r);
}
void build(int u,int l,int r){
  tr[u]={l,r};
  if (l==r){
    tr[u].w=w[r];
    return;
  }
  int mid=l+r>>1;
  build(u<<1,l,mid);
  build(u<<1|1,mid+1,r);
  pushup(u);//给u的权重赋值
}

区间查询


image.png

int query(int u,int l,int r){
  if (tr[u].l>=l&&tr[u].r<=r)
    return tr[u].w;
  int mid=tr[u].l+tr[u].r>>1;
  int v=0;//本示例中查询的是区间最大值
  if (l<=mid)
    v=max(v,query(u<<1,l,r));
  if (r>mid)
    v=max(v,query(u<<1|1,l,r));
  return v;
} 

单点更新

image.png

void modify(int u,int x,int v){//u为结点号,x为位置,v为权值
  if(tr[u].l==tr[u].r){
    tr[u].w=v;
    return;
  }
  int mid=tr[u].l+tr[u].r>>1;
  if (x<=mid)
    modify(u<<1,x,v);
  else
    modify(u<<1|1,x,v);
  tr[u].w=max(tr[u<<1].w,tr[u<<1|1].w);
  return;
}

pushup

pushup用于更新单点权值。

例如,在求一段区间的最大值时,pushup函数为:

void pushup(int u) {
    tr[u].w = max(tr[u << 1].w, tr[u << 1 | 1].w);
}


目录
相关文章
|
2月前
|
算法 安全 大数据
揭秘!Python堆与优先队列:数据结构的秘密武器,让你的代码秒变高效战士!
【7月更文挑战第8天】Python的heapq模块和queue.PriorityQueue提供堆与优先队列功能,助你提升算法效率。堆用于快速找大数据集的第K大元素,如示例所示,时间复杂度O(n log k)。PriorityQueue在多线程中智能调度任务,如模拟下载管理器,按优先级处理任务。掌握这些工具,让代码运行更高效!
56 1
|
11天前
|
存储 算法 C语言
数据结构基础详解(C语言):单链表_定义_初始化_插入_删除_查找_建立操作_纯c语言代码注释讲解
本文详细介绍了单链表的理论知识,涵盖单链表的定义、优点与缺点,并通过示例代码讲解了单链表的初始化、插入、删除、查找等核心操作。文中还具体分析了按位序插入、指定节点前后插入、按位序删除及按值查找等算法实现,并提供了尾插法和头插法建立单链表的方法,帮助读者深入理解单链表的基本原理与应用技巧。
|
11天前
|
存储 C语言 C++
数据结构基础详解(C语言) 顺序表:顺序表静态分配和动态分配增删改查基本操作的基本介绍及c语言代码实现
本文介绍了顺序表的定义及其在C/C++中的实现方法。顺序表通过连续存储空间实现线性表,使逻辑上相邻的元素在物理位置上也相邻。文章详细描述了静态分配与动态分配两种方式下的顺序表定义、初始化、插入、删除、查找等基本操作,并提供了具体代码示例。静态分配方式下顺序表的长度固定,而动态分配则可根据需求调整大小。此外,还总结了顺序表的优点,如随机访问效率高、存储密度大,以及缺点,如扩展不便和插入删除操作成本高等特点。
|
11天前
|
存储 C语言
数据结构基础详解(C语言): 栈与队列的详解附完整代码
栈是一种仅允许在一端进行插入和删除操作的线性表,常用于解决括号匹配、函数调用等问题。栈分为顺序栈和链栈,顺序栈使用数组存储,链栈基于单链表实现。栈的主要操作包括初始化、销毁、入栈、出栈等。栈的应用广泛,如表达式求值、递归等场景。栈的顺序存储结构由数组和栈顶指针构成,链栈则基于单链表的头插法实现。
|
11天前
|
存储 算法 C语言
C语言手撕数据结构代码_顺序表_静态存储_动态存储
本文介绍了基于静态和动态存储的顺序表操作实现,涵盖创建、删除、插入、合并、求交集与差集、逆置及循环移动等常见操作。通过详细的C语言代码示例,展示了如何高效地处理顺序表数据结构的各种问题。
|
2月前
|
算法 计算机视觉 开发者
燃爆全场!Python并查集:数据结构界的网红,让你的代码炫酷无比!
【7月更文挑战第16天】并查集,Python中的效率明星,处理不相交集合合并与查询。用于社交网络分析、图像处理、图论算法等领域。优雅实现结合路径压缩和按秩合并
28 1
|
3月前
数据结构学习记录——堆的建立(最大堆的建立、思路图解、代码实现、代码解释)
数据结构学习记录——堆的建立(最大堆的建立、思路图解、代码实现、代码解释)
30 1
数据结构学习记录——堆的建立(最大堆的建立、思路图解、代码实现、代码解释)
|
3月前
|
存储 算法
【单向链表】数据结构——单向链表的介绍与代码实现&笔记
【单向链表】数据结构——单向链表的介绍与代码实现&笔记
|
3月前
|
搜索推荐 算法
【排序】数据结构——排序算法概念及代码详解(插入、冒泡、快速、希尔)
【排序】数据结构——排序算法概念及代码详解(插入、冒泡、快速、希尔)
|
2月前
|
存储 算法 安全
解锁Python高级数据结构新姿势:堆与优先队列的实战演练,让你的代码更优雅!
【7月更文挑战第8天】Python的`heapq`模块和`queue.PriorityQueue`提供堆与优先队列功能,用于高效数据管理。堆是完全二叉树,`heapq`实现最小堆,常用于任务调度,如按优先级执行任务。当需要线程安全且更复杂操作时,`queue.PriorityQueue`成为优选,例如在管理网络请求时按优先级处理。这两个数据结构能提升代码效率和可读性。
27 0