当前位置: 首页 > news >正文

【数据结构】线段树(点修区查)

数据结构-线段树(点修区查)


前置知识
  • 分治
  • 递归
  • 二叉树

思路

我们需要维护一个支持单点修改,区间查询的数据结构,并且要求在线,一般使用线段树解决。
线段树是一个二叉树形的数据结构。
线段树的思想很简单,就是将每个区间分治,构成一个树形结构,从而达到了 log ⁡ n \log n logn 的时间复杂度
以下是一个维护最小值的线段树。

具体实现也很简单,如下:

  1. 建树( build \text{build} build
    从根节点向下遍历,叶节点自更新,非叶节点使用儿子节点更新( pushup \text{pushup} pushup
  2. 更新( update \text{update} update
    从根节点向下遍历,类似二分查找查找至叶结点,叶节点自更新,非叶节点使用儿子节点更新( pushup \text{pushup} pushup
  3. 查询( query \text{query} query
    从根节点向下遍历,将区间分治到多个节点上,合并答案。如区间 [ 2 , 6 ] = [ 2 , 3 ] + [ 4 , 5 ] + [ 6 , 6 ] [2,6]=[2,3]+[4,5]+[6,6] [2,6]=[2,3]+[4,5]+[6,6],为节点 5 , 6 , 14 5,6,14 5,6,14 处的答案合并而来。

数据结构参数
  • 时间复杂度: O ( n log ⁡ n ) O(n\log n) O(nlogn)
  • 空间复杂度: O ( n ) O(n) O(n)

实现代码

以最小值线段树为例。

int t[MAXN*4];
#define ls p<<1
#define rs p<<1|1
void pushup(int p){t[p]=min(t[ls],t[rs]);
}
void build(int p,int l,int r){if (l==r){t[p]=a[l];return;}int mid=l+r>>1;build(ls,l,mid);build(rs,mid+1,r);pushup(p);
}
void update(int p,int l,int r,int x,int y){if (l==r){t[p]=y;return;}int mid=l+r>>1;if (x<=mid) update(ls,l,mid,x,y);else update(rs,mid+1,r,x,y);pushup(p);
}
int query(int p,int l,int r,int x,int y){if (x<=l&&r<=y) return t[p];int mid=l+r>>1,ans=0x3f3f3f3f;if (x<=l) ans=min(ans,query(ls,l,mid,x,y));else ans=min(ans,query(rs,mid+1,r,x,y));return ans;
}

练习
  • 洛谷【模板】树状数组 1
  • 洛谷【模板】树状数组 2
    因为这个版本的线段树和树状数组差不多。。。
http://www.lryc.cn/news/234793.html

相关文章:

  • Ansys Lumerical | 用于增强现实系统的表面浮雕光栅
  • QT day3作业
  • 【Ubuntu】设置永不息屏与安装 dconf-editor
  • gRPC 的原理 介绍带你从头了解gRPC
  • Apriori算法
  • 肖sir__linux讲解(2.1)
  • The ultimate UI kit and design system for Figma 组件库下载
  • Selenium——利用input标签上传文件
  • C++初阶 日期类的实现(下)
  • 大师学SwiftUI第16章 - UIKit框架集成
  • 7.docker运行redis容器
  • unity教程
  • 未定义与 ‘double‘ 类型的输入参数相对应的函数 ‘Link‘
  • 为什么Transformer模型中使用Layer Normalization(Layer Norm)而不是Batch Normalization(BN)
  • Vite - 配置 - 文件路径别名的配置
  • phpStorm Xdebug调试 加FireFox浏览器
  • 多维时序 | MATLAB实现PSO-BiGRU-Attention粒子群优化双向门控循环单元融合注意力机制的多变量时间序列预测
  • linux配置固定ip(两种方法)
  • 什么是缓存雪崩、击穿、穿透?
  • 可以通过电脑远程控制安卓设备的软件
  • HP惠普暗影精灵9笔记本电脑OMEN by HP Transcend 16英寸游戏本16-u0000原厂Windows11系统
  • vue2+elementUI 仿照SPC开发CPK分析工具
  • 云ES使用集群限流插件(aliyun-qos)
  • 2023.11.17 hadoop之HDFS进阶
  • 如何在el-tree懒加载并且包含下级的情况下进行数据回显-01
  • 系列六、JVM的内存结构【栈】
  • 技巧篇:在Pycharm中配置集成Git
  • Yolov5
  • 36、Flink 的 Formats 之Parquet 和 Orc Format
  • Docker 笔记(一)--安装