首页 > 其他分享 >线段树学习笔记

线段树学习笔记

时间:2024-12-02 18:55:19浏览次数:4  
标签:dat 结点 int 线段 笔记 学习 二叉树 区间

线段树学习笔记

对线段树的介绍

  1. 线段树是一种树形数据结构,属于二叉树
  2. 一棵线段树的每个结点都可以用区间\([l,r]\)来表示。线段树的叶结点表示的区间为\([l,l]\)或\([r,r]\)。
  3. 线段树支持单点修改,区间修改,区间和/区间最值等的查询。
  4. 对于线段树的区间修改一般采用延迟修改方式
  5. 线段树去掉最后一层后是一棵满二叉树

线段树的建树

线段树的表示

因为线段树是一棵二叉树,所以可以采用与二叉堆一致的表示法:

编号为p的结点的

  1. 左结点的编号为\(p\times2\)
  2. 右结点的编号为\(p\times2+1\)

类似二叉堆,线段树是一个结构体数组。

C++ - 6 行
struct SegmentTree
{
    int l,r;// 表示该结点代表的区间
    int dat;//区间[l,r]的最大值
    int add;//延迟修改标记
}

线段树的结点

为了避免最最让人难受的RE,所以考虑一棵线段树的最大结点数。

设现在需要表示区间\([1,n]\),使得构造的线段树为一棵满二叉树。

由线段树的性质得知,该二叉树有\(n\)个叶结点,则总结点数为\(n+n\div2+n\div4+···+2+1\),即\(4n-1\)。

因为我的个人习惯,我一般会不处理一个数组的第一个元素,即下标为\(0\)的元素。

C++ - 27 行
#include<bits/stdc++.h>
using namespace std;
struct SegmentTree
{
    int l,r;// 表示该结点代表的区间
    int dat;//区间[l,r]的最大值
    int add;//延迟修改标记
} t[4*1000001];
int va[114514];//区间是数组下标区间,这是线段树叶结点实际代表的值
void bulid(int l,int r,int p)// 结点的数组下标为p,表示区间[l,r]
{
    t[p].l = l;//代表区间初始化
    t[p].r = r;
    if(l == r)//叶结点
    {
        t[p].dat = va[l];
        return;// 如果你想RE,建议删去这行
    }
    int mid = (l + r) / 2;
    bulid(l,mid,p*2);// 左子结点
    bulid(mid+1,r,p*2+1);//右子结点
    t[p].dat = max(t[p*2].dat,t[p*2+1].dat);//自下往上更新数据
}
int main()
{
    //略
}

标签:dat,结点,int,线段,笔记,学习,二叉树,区间
From: https://www.cnblogs.com/Kelojonle/p/18582480

相关文章

  • 【Nginx学习】5大绝招揭秘:Nginx进程间通信机制之互斥锁——文件锁实现的ngx_shmtx_t锁
    ......
  • 【LMR-CBT】基于CB-Transformer的学习模态融合表征在非对齐多模态序列中的情感识别
    abstract学习模态融合表征和处理未对齐的多模态序列是多模态情感识别中具有重要意义和挑战性的问题。现有的方法使用双向注意或信息中心来融合语言、视觉和音频模式。然而,这些方法在融合特征时引入了信息冗余,并且没有考虑模式的互补性,效率低下。在本文中,我们提出了一种有效的......
  • 如何将音乐从笔记本电脑传输到 iPhone?
    每次我用笔记本电脑上网时,我都会打开笔记本电脑的音乐播放器随机播放推荐的音乐,无一例外的是,那些悠扬的歌曲让我大吃一惊。我是多么幸运啊!作为一个发烧友,我发现iPhone无疑是一款出色的音乐播放器,它在音乐音色、音质和高保真系统方面都表现出色。因此,在iPhone上欣赏这些美妙的音......
  • OSG开发笔记(三十六):osg3.4.0基于windows平台msvc2017x64编译器编译并移植Demo
    前言  本篇编译osg3.4.0的msvc2017x64版本,之前使用的都是mingw32版本。 OSG编译步骤一:下载解压  下载3.4.0版本。  步骤二:使用cmake配置        因为是64位,可以通过后续配置cmake用x64,也可以直接选择构架:    继续:    ......
  • itertools 模块学习
    1.创建无限循环迭代对象:count,cycle,repeatfromitertoolsimportcountforiincount(1,2):ifi>10:breakprint(i)#以1开始,2为步长,无限range结果:13579fromitertoolsimportcyclecolors=cycle(['red','green','blue�......
  • 机器学习:逻辑回归
    简介在前两篇文章中,我们详细探讨了如何利用采样数据来估计回归曲线。接下来,在本节中,我们将深入讨论如何处理分类问题。章节安排背景介绍数学方法程序实现背景介绍线性可分线性可分是指在多维空间\(\mathbb{R}^D\)中,对于任意两个类别的数据,总是存在一个超平面,可以将这两......
  • 11月阅读笔记
    技术与实践代码即沟通:书中强调了代码的可读性和可维护性。代码不仅仅是实现功能的工具,更是与同事、未来自己沟通的桥梁。因此,我们应该注重代码的整洁、清晰,避免冗余和混乱。持续学习:在这个快速变化的时代,持续学习是程序员保持竞争力的关键。书中提到了多种学习方法,如阅读技术书......
  • 关于3D MAX的学习心得
    学习3DMax心得体会        在数字化时代,3D技术已经成为设计、娱乐、建筑等多个领域不可或缺的一部分。3DMax作为一款专业的三维建模软件,它的学习过程不仅是技能的积累,更是对个人耐心、创造力和团队协作能力的一次全面提升。以下是我在学习3DMax过程中的一些深刻体......
  • 深度学习中的前向传播与损失函数
    目录​编辑前向传播:神经网络的推理过程什么是前向传播?前向传播的步骤数学表达代码示例:前向传播损失函数:衡量预测与真实值的差异损失函数的定义损失函数的作用常见的损失函数代码示例:损失函数前向传播与损失函数的结合反向传播:优化模型参数代码示例:反向传播结论......
  • PHP语法学习(第三天)
    老规矩,先回顾一下昨天学习的内容PHP语法学习(第二天)主要学习了PHP变量、变量的作用域、以及参数作用域。今天由Tom来打开新的篇章文章目录echo和print区别PHPecho语句实例PHPprint语句实例PHP数组创建数组利用array()函数数组的类型索引数组关联数组......