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

线段树合并学习笔记

时间:2023-06-08 16:12:12浏览次数:49  
标签:return int 线段 合并 mid 笔记 节点

前言

我是一个什么什么傻卵啊啊啊啊啊啊啊啊,连线段树合并都学不明白qaq

正文

权值线段树

含义:

是用来维护好多好多桶的线段树. 桶是一个用来计数的东西.

与普通线段树的区别

普通线段树是用来维护区间和、积、最值等一系列的东西.

权值线段树是用来维护某个区间内的数出现了多少次的。它还可以插入数据,维护第 \(k\) 小(大)值.

动态开点

有时候题目给的数据范围很大,用普通的线段树可能会MLE时,我们就会选择动态开点。动态开点,就是什么时候需要某个点,什么时候把它建出来。所以动态开点线段树的编号法则不符合普通线段树的“父子二倍法”。我们选择用一个非常普通的计数变量(例如 \(cnt\) )来表示线段树的节点编号.

代码实现

void insert(int& p, int l, int r, int x, int v) {
    // p是节点编号, 要引用传参, [l, r]是值域, x ∈ [l, r], v是增量.
    if (!p) p = ++cnt; // 如果不存在这个节点, 就把这个节点开出来.
    if (l == r) { // 递归到叶子结点.
        t[p].data += v;
        return;
    }

    int mid = (l + r) >> 1;
    // 判断x在哪一半区间内
    if (x <= mid) insert(t[p].l, l, mid, x, v);
    else insert(t[p].r, mid + 1, r, x, v);
    pushup(p);
}

线段树合并

就是把若干棵线段树合并到一起. 合并操作是求和(积)还是求最值取决于个人需要.

合并的两棵线段树的大的值域应当是相同的.

如何合并

  • 先递归到叶子结点.
  • 若两棵线段树的相同位置都存在节点, 则合并两个节点作为新的节点.
  • 若某一刻线段树的相应节点不存在, 则取那个存在的节点作为新的节点.

代码实现

void merge(int& a, int b, int l, int r) {
    // a需要引用传参, 因为将b合并到a上.
    if (!a || !b) {
        a = a ? a : b;
        return;
    }
    if (l == r) {
        t[a].data += t[b].data;
        // 这里是对值的合并操作. 这里以两棵线段树求和为例.
        return;
    }

    int mid = (l + r) >> 1;
    // 左子树和左子树合并, 右子树和右子树合并.
    merge(t[a].l, t[b].l, l, mid);
    merge(t[a].r, t[b].r, mid + 1, r);
    pushup(a);
}

\[TO BE CONTINUED...... \]

标签:return,int,线段,合并,mid,笔记,节点
From: https://www.cnblogs.com/Chronologika/p/17466790.html

相关文章

  • SNMP学习笔记之SNMP报文以及不同版本(SNMPv1、v2c、v3)的区别
    SNMP学习笔记之SNMP报文以及不同版本(SNMPv1、v2c、v3)的区别本篇文章将重点分析SNMP报文,并对不同版本(SNMPv1、v2c、v3)进行区别!四、SNMP协议数据单元在SNMP管理中,管理站(NMS)和代理(Agent)之间交换的管理信息构成了SNMP报文,报文的基本格式如下图1:        ......
  • 《大学物理实验上》期末笔记(三)作图法以及一些实验
    《大学物理实验上》期末笔记(三)作图法以及一些实验数据处理有多种方法,下面仅就作图法、逐差法作简单介绍。作图法就考试来说,结果不是最主要的,过程才重要。评分标准(共15分):图的题目——1分横坐标的物理符号与单位、还有分度选择——各1分,共3分纵坐标的物理符号与单位、还有分......
  • 微信小程序开发笔记 进阶篇⑤——getPhoneNumber 获取用户手机号码(基础库 2.21.2 之前
    文章目录一、前言二、前端代码wxml三、前端代码js四、后端java五、程序流程六、参考一、前言微信小程序开发笔记——导读大部分微信小程序开发者都会有这样的需求:获取小程序用户的手机号码。但是,因为小程序用户的手机号码属于重要信息,为了安全,所以需要如下一系列较为复杂的方法和......
  • 微信小程序开发笔记 进阶篇⑥——getPhoneNumber 获取用户手机号码(基础库 2.21.2 之后
    文章目录一、前言二、前端代码wxml三、前端代码js四、后端java五、程序流程六、参考一、前言微信小程序开发笔记——导读大部分微信小程序开发者都会有这样的需求:获取小程序用户的手机号码。但是,因为小程序用户的手机号码属于重要信息,为了安全,所以需要如下一系列较为复杂的方法和......
  • 数学期望学习笔记
    数学期望是在做题的时候发现的概念,写一篇笔记来记录一下。什么是期望日常生活中我们对于每一件事都有自己的期望,这里的期望不只是指结果的胜负之类,也可以与状态有关。在OI中,我们一般指的就是到达结果的期望,朴素做法是每次可能结果的概率乘结果的总和。广义上的定义:一次随......
  • 008 数据库学习笔记--触发器
    主要内容来自:https://blog.csdn.net/KingCruel/article/details/106292310https://blog.csdn.net/qq_36330228/article/details/90582493触发器:触发器,可理解为一种特殊的存储过程。是一个特殊的事务(在执行过程中,可执行一些检查或设置条件,不满足时,可回滚操作)存储过程,通过存......
  • git pull和git pull origin master (拉取远程分支合并到其他本地分支)
    gitpull用法:gitpull命令的作用是:取回远程主机某个分支的更新,再与本地的指定分支合并。一句话总结gitpull和gitfetch的区别:gitpull=gitfetch+gitmergegitfetch不会进行合并执行后需要手动执行gitmerge合并分支,而gitpull拉取远程分之后直接与本地分支进行合并。更准......
  • 《机器学习实战》学习笔记(4)—— Logistic 回归
    1Logistic回归算法描述工作原理:为了实现Logistic回归分类器,可以在每个特征上都乘以一个回归系数,然后把所有结果的值相加,将这个总和带入Sigmoid函数中,进而得到一个范围在0-1之间的数值。任何大于0.5的数据被分入1类别,任何小于0.5的数据被分入0类别。Logistic回归也可以被看......
  • 《机器学习实战》学习笔记(3)—— 朴素贝叶斯
    1朴素贝叶斯算法描述工作原理:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就认为此待分类项属于哪个类别。2计算概率的伪代码计算每个类别中的文档数目:对每篇训练文档:对每个类别:If词条出现在文档中:增加该词条的计数值......
  • Unity动画系统学习笔记
    title:Unity动画系统学习笔记date:2023-06-07T07:42:12Zlastmod:2023-06-07T11:27:45ZUnity动画系统学习笔记动画系统Unity动画系统动画片段AnimationClip:动画资源,用于展示游戏物体变化动画状态机AnimatorController:控制游戏物体各动画片段播放与切换......