首页 > 其他分享 >详解主席树与二维数点问题

详解主席树与二维数点问题

时间:2023-11-04 11:56:44浏览次数:27  
标签:线段 数点 差分 二维 详解 数组 主席

主席树与二维数点问题

前言:

自己在网上搜索了很久,都没有看到具体是怎么维护的,下课问了下,一下就点醒了。

正文:

先考虑主席树和二维数点有什么关系。
我们可以将y轴看成一个时间轴。
我们查询y1-y2之间的数字时,其实就是查询这些版本下的x1-x2的区间和,最后由于可加性,直接差分相减即可。
然后我写着写着,在差分那里愣住了。
就是说要是我要修改x,y的话,就是修改时间为y的线段树,很容易。
问题在于,这是差分啊!我必须要把y和y以后的所有都+1才对。这样时间复杂度就是戳的。
所以说,我们必须要加完所有的点,再询问,时间复杂度才是对的(相当于在中间做了个线段树合并)
或者说,可以在中途加一个树状数组多一个log来搞混杂的这些东西。

当然了,其实也不需要合并这么做。
竟然我加点和查询分开了的话,我直接给点按照y排个序就好了......
假如说这一排新加了点x,那么我直接继承上一次的线段树,在x处修改变为这一次的就好了......
(感谢老师点醒我x2)

带权值的点也可以这样做。(就不是+1了)
一道题可以试着用主席树维护。

拓展:

其实呢,有个东西叫做二维树状数组,就是上面那道题的板子。
但是这对数组大小会有严格的限制,这就是主席树的优势。他可以做到n和m双1e5的样子。

打码思路:

首先所有点按照时间先后为第一关键字,位置为第二关键字排序(有时候要去重)。
这里我一般用x作为时间。
每一次遇到新的时间点,继承上一次的root,开新的主席树,直接做。(注意要是中间有“跳行”情况,也要直接继承,不然就中断了前缀和)
利用差分求解区间和即可。

标签:线段,数点,差分,二维,详解,数组,主席
From: https://www.cnblogs.com/linghusama/p/17809130.html

相关文章

  • Android动态代理详解
    动态代理在java里面算是一种比常用的技术,它和静态代理的区别在于静态代理需在编译的时候代理类就已经确定了,而动态代理的代理类是在运行的时候动态生成的。例如使用retrofit的时候我们只需要定义好interface:publicinterfaceGitHubService{@GET("users/{user}/repos")Ca......
  • 猫树详解
    一、猫树的作用学一个算法当然得先了解它的用处,那么猫树的作用嘛...简单来讲,线段树能维护的信息猫树基本都能维护比如什么区间和、区间gcd、最大子段和等 满足结合律且支持快速合并的信息二、猫树的算法实现什么都别说,我知道你想先知道猫树是怎么实现的我们就以区间和查......
  • Python 中的 __init__.py 和__all__ 详解(抄袭的joker) 因为写的实在是太好了
    Python中的__init__.py和__all__详解JOKER没意思先生 之前不论是自己写代码还是用别人的代码,都没有注意过这个东西,今天忽然看了一下,网上的教程感觉讲的都不是很清楚,自己又研究了研究,总结一下,如果有不对的地方,大家帮忙指正一下。在Python工程里,当pyth......
  • CentOS7中firewall防火墙详解和配置
    提示修改防火墙配置文件之前,需要对之前防火墙做好备份重启防火墙后,需要确认防火墙状态和防火墙规则是否加载,若重启失败或规则加载失败,则所有请求都会被防火墙拒绝firewalld的基本使用#停止firewallsystemctlstopfirewalld.service#禁止firewall开机启动systemctldisablefi......
  • T端与R端详解:光纤收发器接口区分与作用
    在光纤通信系统中,了解光纤收发器的T端(Transmit,发送端)与R端(Receive,接收端)对于保障数据传输的正确性至关重要。本文将对这两个接口进行详细解析。T端与R端的定义T端(Transmit端):这是光纤收发器用来发送信号的接口。它将电信号转换为光信号,通过光纤线路传送给对端设备。R端(Receive端):此接......
  • HashMap源码详解
    HashMap简介HashMap是Java语言中的一种集合类,它实现了Map接口,用于存储Key-Value对。它基于哈希表数据结构,通过计算Key的哈希值来快速定位Value的位置,从而实现高效的插入、删除和查找操作。下面我们对照着JAVA1.8中的HashMap源码来分析一下它的内部实现逻辑基本的结构在开始分析......
  • c#中工厂模式详解
    总体介绍:  工厂模式主要有三种类型:简单工厂、工厂方法和抽象工厂,该模式用于封装和管理对象的创建,是一种创建型模式。  万物皆对象,创建对象时必然需要new该对象,当需要更改对象时,需要把项目中所有地方都修改一遍,这显然违背了软件设计的开闭原则。  如果使用工厂来生成对象,......
  • C++ 移动构造函数详解
    目录移动构造函数是什么?复制构造和移动构造对比改进的拷贝构造移动构造实现移动构造优点左值、右值、左值引用、右值引用std::move参考移动构造函数是什么?移动构造是C++11标准中提供的一种新的构造方法。先举个生活例子,你有一本书,你已经不想看了,但我非常想看,那么我有哪......
  • 详解Java LinkedList
    LinkedList简介LinkedList是List接口的实现类,基于双向链表实现,继承自AbstractSequentialList类,同时也实现了Cloneable、Serializable接口。此外还实现了Queue和Deque接口,可以作为队列或双端队列使用。LinkedList的插入删除时间复杂度:在头部或尾部插入删除元素,只需要修改头节......
  • Chromium VIZ架构详解
    1.VIZ的三个端在设计层面上viz的架构如下图所示:在设计上 viz 分了三个端,分别是client端,host端和service端。client 端用于生成要显示的画面(CF)。应用中至少有一个rootclient,可以有多个childclient,它们组成了一个client树,每个Client都有一个FrameSinkId......