首页 > 其他分享 >线段树初步理解

线段树初步理解

时间:2024-10-24 12:43:01浏览次数:1  
标签:缓存 标准状态 线段 儿子 初步 理解 lazytag 节点

今天ZRtes爆零咯,就不在tes里写了

引言:以前一直只会用线段树2,线段树也是一直当做工具使用,一切线段树的科技除了线段树分治基本都不会,因此特作此文记之

线段树的 lazytagpushdown

为了保证时间复杂度,线段树在做区间修改的时候引入了 lazytag 的概念,目的是为了节省没必要的时间复杂度,但是由于有了这个懒标记的存在,导致线段树的节点之间的时间维度是不统一的(父亲比儿子更加接近现在的状态),因此可以把 lazytag 看做是一个操作的缓存,而 pushdown 则是用父亲节点更加先进的状态来更新儿子节点落后的状态,也就是把父亲节点的缓存清空,缓存的内容一方面用于更改儿子的落后状态,一方面接入到儿子的缓存中,以备更新儿子的儿子。

线段树节点 标准状态 的定义

观察线段树的代码,发现当 L<=l&&r<=R 的时候更新完当前节点后就会退出函数,不在递归,这其实是对标准状态的修改,就比如 线段树1 中的 addtag 本质上就是对于线段树节点标准状态的一个修改(或者叫做增量)。而一个线段树的 标准状态 是在其把缓存都推给儿子之后,递归完儿子之后用儿子的信息来更新父亲节点,这个时候就会对标准状态重新求值,然后所有的增量全部清零,就是有点像把所有的缓存的给永远刻在这个节点上

线段树维护历史版本和

这个时候还需要记一个标记:在这个节点上,相对于时间轴来说有多少次操作是没有被传给儿子的,因此在统计到这个点的时候,一方面所有祖先的这个标记都传给为了当前节点,因此当前节点就是现在状态,而在把这些标记全部传给儿子,想办法把这些操作时儿子的历史和的贡献算出来,把儿子递归完之后,把儿子的状态传回来,更新标准状态,刻进这个节点里头。

标签:缓存,标准状态,线段,儿子,初步,理解,lazytag,节点
From: https://www.cnblogs.com/chenhx-xcpc/p/18499370

相关文章

  • 【NLP自然语言处理】Attention机制原理揭秘:赋予神经网络‘聚焦’与‘理解’的神奇力量
    目录......
  • 【YOLOv11改进- 原理解析】 YOLO11 架构解析 以及代码库关键代码逐行解析
    YOLOv11目标检测创新改进与实战案例专栏文章目录:YOLOv11创新改进系列及项目实战目录包含卷积,主干注意力,检测头等创新机制以及各种目标检测分割项目实战案例专栏链接:YOLOv11目标检测创新改进与实战案例文章目录YOLOv11目标检测创新改进与实战案例专栏冷笑话......
  • 说说对c++面向对象(oop)的三个特性的理解,求大佬指指点点好好指导一下
    前言:在c++中oop编程是十分复杂的。但是我想不会有人可以去拒绝一种本土的非解释语言的语言。或许c#,java,以及解释语言lua,python都是不错的语言所有能做到事情都一样。 不过作为一个小白我很难去评价一件事,每个人都有自己的看法。类即是万物,所谓类就是抽象,白话来讲就是,你我都......
  • Python学习的自我理解和想法(20)
    #1024程序员节|征文#学的是b站的课程(千锋教育),跟老师写程序,不是自创的代码!今天是学Python的第20天,学的内容是面向对象中的私有属性,私有方法,多态,单例计模式。开学了,时间不多,写得不多,见谅。目录1.私有属性(1).含义(2).语法(3).演示(4).调用私有属性2.私有方法(1).含义......
  • Java强制类型转换:深入理解与实践
    在Java编程中,类型转换是一个常见的操作,它允许我们将一个数据类型的值转换为另一个数据类型的值。Java提供了两种类型转换:自动类型转换(隐式类型转换)和强制类型转换(显式类型转换)。在这篇文章中,我们将重点探讨强制类型转换,包括它的使用场景、语法、以及在实际编程中的应用。什么......
  • 线段树?Lazytag?
    本文导读:本博客主要介绍了线段树的原理和构造的过程,以及一些例题,如果有不足的点,欢迎指出qwq.线段树\((1)_{36}\):什么是线段树?作为一个蒟蒻qwq,看到"线段树"三个字时,你想到了什么?蒟蒻:我知道!不就是"线段+树"吗!......作者:哎呀,你到底在说什么,还是我来解释吧...1.线段树......
  • 深入理解Linux内核网络(五):TCP连接的建立过程
    本文将深入探讨TCP协议中的listen和connect系统调用及其相关机制,并对TCP连接建立的完整过程进行详细分析,同时讨论异常情况及其处理方法。部分内容来源于《深入理解Linux网络》、《Linux内核源码分析TCP实现》listen原理系统调用概述listen用于将一个主动套接字(主......
  • 内存优化的秘密:深入理解 Linux 中的 madvise
    madvise是一个在Linux和其他类Unix操作系统中使用的系统调用,用于向内核提供关于内存映射区域的建议。它可以帮助操作系统优化内存使用,以提高性能。使用场景madvise函数通常用于以下几种情况:预取数据:如果应用程序知道将来会使用某些数据,可以建议操作系统提前加载这些数据到内......
  • 并发面试题-谈谈你对AQS的理解
    简要回答AQS(AbstractQueuedSynchronizer抽象队列同步器)是Java并发包中的一个核心组件,它提供了一个框架用于实现基于FIFO等待队列的阻塞锁和同步器。AQS通过管理一个同步状态和一个等待队列来控制多线程对共享资源的访问。它定义了一系列模板方法,如tryAcquire、tryRelease等,供......
  • 连锁超市会员管理系统设计与实现(源码+定制+开发)会员信息管理平台、超市会员系统开发、
    博主介绍:  ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W+粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台的优质作者。通过长期分享和实战指导,我致力于帮助更多学生......