首页 > 其他分享 >方方方的数据结构

方方方的数据结构

时间:2024-05-18 17:07:29浏览次数:24  
标签:线段 方方 1b 扫描线 操作 变成 数据结构 我们

总算给我看懂到底是什么意思了。。。

首先我们来考虑按照时间+扫描线进行处理,假设操作如下

黑色是加操作,黄色是乘操作,绿色是加操作,对于红色那条线所代表的点,随着时间的流逝,首先在刚刚进入黑色的时候,这一点的值就被加上了一个数,然后刚刚进入黄色的时候,这一点的值就被乘上了一个数,刚刚进入绿色的时候,这一点的值就被加上了一个数,所以总体顺序是加乘加,然而如果我们按照扫描线处理,顺序就会变成黑绿黄,就错了

所以这道题目的顺序是很重要的,这启示我们不能按照扫描线做,只能老老实实按照时间递增去做

假设没有撤销操作,那么这就是普通的线段树了

有了撤销操作肯定要做一些更改,而且还有时间这一维度,由于我们不能按照扫描线做,我们就对时间进行分块处理

接下来仍然先讨论没有撤销操作的做法

我们仍然值来看红色这个点,假设经过第一块之后,他的值为\(x\),那么接下来我们考虑经过第二块之后他会变成什么

遇到了加操作,变成了\(x+b_1\);遇到了加操作,变成了\(x+b_1+b_2\);遇到了乘操作,变成了\((x+b_1+b_2)\times a_1=a_1x+a_1b_1+a_1b_2\);遇到了加操作,变成了\(a_1x+a_1b_1+a_1b_2+b_3\);遇到了乘操作,变成了\((a_1x+a_1b_1+a_1b_2+b_3)\times a_2=a_1a_2x+a_1a_2b_1+a_1a_2b_2+a_2b_3\)

根据以上过程我们不难发现,我们可以考虑每个加操作的贡献,一个加操作的贡献就是这个加的值与其后面所有乘操作的积,而最开始的值\(x\),最后也会乘以这个块里面所有乘操作的积;以上两部分加起来就是\(x\)经过这个块之后会变成的值

于是我们可以对每一个块内都维护一个线段树,线段树的每一个叶子节点维护两个值,\(a\)和\(b\),表示叶子节点所代表的位置传入这个块的值为\(x\),那么经过这个块之后,\(x\)就会变成\(ax+b\)。显然\(a,b\)这两个参数只跟这个块里面的修改操作有关,跟\(x\)无关,所以上述维护是没有问题的

然后我们再来考虑撤销操作。有了撤销操作,就是将一个无限长的矩形变成了一个有限长度的矩形,就像这样

也就是代表这个操作的有限区间

我们假设这个矩形上面的边所在的块的编号为\(l\),下面的边所在的块的编号为\(r\),对于\([l+1,r-1]\)的块的线段树来说,是否有这个操作,任意一个线段树的任意一个叶子节点维护的\(a,b\)是不会变化的,所以我们只需要暴力修改\(l\)的线段树就好了,而且在处理\(r\)的线段树的时候,不用管这个操作

查询的时候,前面的块的部分利用线段树快速查询,块内部分暴力查询即可

标签:线段,方方,1b,扫描线,操作,变成,数据结构,我们
From: https://www.cnblogs.com/dingxingdi/p/18199502

相关文章

  • 数据结构学习笔记-有向图的度
    求有向图的度问题描述:已知有向图G用邻接矩阵存储,设计算法以分别求解顶点vi的入度、出度和度。【算法设计思想】出度的计算(getOutDegree)遍历法:通过遍历邻接矩阵中顶点vi所在行的所有元素来计算vi的出度。对于每个元素matrix[vi][j],如果其值不为0(表示存在从顶点vi到顶点......
  • Python知识 | Python的数据结构有哪些?
    Python的数据结构有哪些?Python数据结构概览在Python中,数据结构是编程语言的基础,它们决定了数据如何组织和存储。Python的标准库提供了多种内置数据结构,包括:列表(List)列表是一种可变的序列,可以随时添加、删除或修改其元素。列表以方括号[]表示,元素可以是任何类型的数据。元组(T......
  • 数据结构简介及PYTHON里的数据类型
    1、什么是数据结构?先介绍几个概念。信息是目前在生活和工作中最经常听到的一个词,但要给信息这个概念一个容易理解的确切定义并不容易。人们希望用计算机处理的终极对象就是客观存在的各种信息,因此说计算机是处理信息的工具。数据是信息的载体,是指计算机(程序)能够处理的符号形式......
  • 数据结构概述
    数据结构定义我们如何把现实中大量而复杂的问题以特定的数据类型和特定的存储结构保存到主存储器(内存)中,以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,对所有元素进行排序)而执行的相应操作,这个相应的操作也叫算法数据结构=个体+个体的关系算法=对存储数据的......
  • 数据结构:红黑树
    满足五条性质:1.根节点一定是黑色2.叶节点一定是黑色空心3.节点非黑即红4.红色节点孩子节点一定是黑色的即不会出现连续的红色节点5.任意一个节点到叶节点路径上黑色节点数量一样多 右旋操作:1.该节点和左孩子断开连接2.左孩子替代......
  • (转载)数据结构-02 中缀表达式转后缀表达式并计算值
    1.图解中缀表达式转后缀表达式通过 数据结构-01-图解后缀表达式值计算方式 我们了解到后缀表达式(例如:931-3*+102/+)对计算机运算的方便,但是它却让我们这些人类十分的难受,因此我们需要在设计一个,中缀表达式转后缀表达式的程序来一劳永逸. 规则:依次遍历表达式,1.如......
  • (转载)数据结构-01-图解后缀表达式值计算方式
    目录:数据结构-01-图解后缀表达式值计算方式数据结构-02图解中缀表达式转后缀表达式并计算值1.简介问题:我们平常使用的数学表达式大多数是“中缀表达式”例如:9+(3-1)×3+10÷2,对人比较友好,但是这个对计算机计算并不友好,因为计算机无法智能判断运算顺序的问题(比如说乘法加......
  • 数据结构学习笔记-先序遍历森林
    先序遍历森林问题描述:设计算法输出先序遍历的森林节点及其所在的层次【算法设计思想】1.数据结构定义首先,定义二叉树节点的数据结构。每个节点包含存储数据的data字段,以及指向左右子节点的指针(lChild和rChild)。这种数据结构是二叉树和森林表示的基础。2.先序遍历单棵树设......
  • 数据结构学习笔记-递归求解森林高度
    森林的高度递归求解问题描述:设计算法求解森林的高度【算法设计思想】两个函数,一个用于计算单个二叉树的高度,另一个用于计算二叉树森林(即一组二叉树)的最大高度。下面是对两个函数的详细解释:1.treeHeight函数这个函数用于计算单个二叉树的高度。二叉树的高度定义为从根节点到......
  • TheAlgorithms/C - 各种基础算法、数据结构的 C 语言实现+armink/SFUD - 一款基于 JED
    1、OpenMV-RT-基于恩智浦i.MXRT系列的开源机器视觉AI模块OpenMV-RT是一款基于恩智浦最近主打的i.MXRT超高性能系列MCU的视觉模块,模块设计者是恩智浦大牛工程师宋岩(对,就是ARMCortex-M3权威指南中文版作者)。模块源代码: https://github.com/RockySong/micropython......