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

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

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

类设计

一个线段树的结点包含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并查集:数据结构界的网红,让你的代码炫酷无比!
在编程的世界里,总有一些数据结构以其独特的魅力和高效的性能脱颖而出,成为众多开发者追捧的“网红”。今天,我们要介绍的这位明星,就是Python中的并查集(Union-Find)——它不仅在解决特定问题上大放异彩,更以其优雅的设计和强大的功能,让你的代码炫酷无比,燃爆全场!
41 0
|
29天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
62 1
|
5月前
|
算法 安全 大数据
揭秘!Python堆与优先队列:数据结构的秘密武器,让你的代码秒变高效战士!
【7月更文挑战第8天】Python的heapq模块和queue.PriorityQueue提供堆与优先队列功能,助你提升算法效率。堆用于快速找大数据集的第K大元素,如示例所示,时间复杂度O(n log k)。PriorityQueue在多线程中智能调度任务,如模拟下载管理器,按优先级处理任务。掌握这些工具,让代码运行更高效!
82 1
|
2月前
|
存储 Java 开发者
Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效
【10月更文挑战第19天】在软件开发中,随着项目复杂度的增加,数据结构的组织和管理变得至关重要。Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效。本文通过在线购物平台的案例,展示了Map在商品管理、用户管理和订单管理中的具体应用,帮助开发者告别混乱,提升代码质量。
35 1
|
2月前
|
存储 算法 索引
HashMap底层数据结构及其增put删remove查get方法的代码实现原理
HashMap 是基于数组 + 链表 + 红黑树实现的高效键值对存储结构。默认初始容量为16,负载因子为0.75。当存储元素超过容量 * 负载因子时,会进行扩容。HashMap 使用哈希算法计算键的索引位置,通过链表或红黑树解决哈希冲突,确保高效存取。插入、获取和删除操作的时间复杂度接近 O(1)。
32 0
|
2月前
05(数据结构考研)树相关操作代码
05(数据结构考研)树相关操作代码
32 0
|
2月前
|
算法
04(数据结构考研)串相关操作代码
04(数据结构考研)串相关操作代码
21 0
|
2月前
03(数据结构考研)队列相关操作代码
03(数据结构考研)队列相关操作代码
43 0
|
2月前
02(数据结构考研)栈相关操作代码
02(数据结构考研)栈相关操作代码
15 0
|
2月前
01(数据结构考研)线性表相关操作代码
01(数据结构考研)线性表相关操作代码
87 0