首页 > 其他分享 >lg根号数据结构

lg根号数据结构

时间:2024-08-19 20:16:55浏览次数:8  
标签:lg 分块 sqrt 修改 数组 mathcal 数据结构 莫队 根号

根号数据结构

序列分块

通过将序列分成小段,整块标记,不足整块的暴力,以平衡修改查询的复杂度。

如果两个操作的调用次数有较大差异,可以使用分块维护更多/更少信息来平衡两边的时间复杂度。请注意并非选择“更快”的数据结构就更好,比如树状数组看似更平衡,但是修改和询问的次数不平衡的时候反而不合适。

如果想要不平衡的区间加区间求和,可以把树状数组的那个做法搬到分块上


  • LOJ 6278/6279

分块做法

每一个块都维护一个排好序的数组,扫过整块的时候二分,修改的时候整块打 tag,不完整的块就暴力做,然后重新排序。\(\mathcal O(\sqrt n\log n)\)

归并做法

重新排序可以这样做:如果为排序后的数组保存一个 pos,每次修改把排序后数组分开,两边都是有序的,然后用归并排序进行 merge。这时候这一部分就优化为 \(\mathcal O(\sqrt n)\)

现在修改是 \(\mathcal O(S+n/S)\) 查询是 \(\mathcal O(S+n/S\log S)\)

令块长为 \(S=\sqrt{n\log n}\)

  • LOJ 6284

事实上,每个整块被查一次之后就肯定变成同一个了。每次询问会增加 \(\mathcal O(1)\) 个坏的块,总共可能产生 \(\mathcal O(\sqrt n+m)\) 个坏的块,总复杂度就是对的。

  • P4117

考虑每个数可以被操作的次数有限,故记录每个块的最大值。考虑如何能够均摊 \(\mathcal O(1)\) 枚举,所以我们的目标是某一个值域被枚举之后就不要再枚举它,我们发现当 \(2x\ge max\) 的时候是 ok 的,但是小的时候,我们就亏了,所以有一个技巧是对大的减转化为对全局减对小的加,相当于维护了一个取值区间,分情况提高最小值、减小最大值。

这里还有空间的问题,我们发现每一个块的贡献皆独立,所以我们可以对于每一块跑一遍所有询问,这样桶就可以被重复使用。


值域/操作分块

  1. 对值域数组的分块

  2. 操作分块(按时间分块):操作和询问按照时间分为若干块,对于前面所有块,我们把那些影响直接贡献到一个支持快速查询的数据结构上,内部的修改我们只计算他对询问的贡献,这个块的询问跑完之后再固定到数据结构上。

  • 1

我们先 \(\mathcal O(nk)\) 得到单点修改之后 delta 的表示。这样可以 \(\mathcal O(1)\) 计算贡献。现在考虑如何固定影响,考虑直接求一遍。

令块长为 \(S\) ,则 \(\mathcal O(nS+kn\frac{n}S)\) ,\(S=\sqrt{nk}\)

  • 2: APIO2019 桥梁

没有修改,可以用并查集。这里并不好计算修改对答案的贡献,但是可以利用块内修改很少的特点

  1. DFS 序分块

对树的 DFS 序进行序列分块。

  1. 重链剖分+序列分块

对一条长为 \(k\) 的重链进行序列分块,按 \(\sqrt k\) 分块 ,用于优化链修改链查询,不能做子树操作。

  • CF925E May Holidays

先转化为链操作,赋予每一个点 \(-v_i\) 的权,考虑进行树链分块。加1减1操作有特殊性,把相邻的数合并之后,我们可以不用二分,只需要维护一个指针。然后边块修改的时候可以用归并,单点修改的时候暴力加了之后二分一下然后插入。

  1. 简易树分块

在 \(n\) 个点的树上随机撒 \(\sqrt n\) 个点,期望两个关键点之间距离期望为 \(\sqrt n\)

贪心可以将这个变成严格的:按深度排序从大到小扫,若没有标记,就设为关键点并向上跳 \(\sqrt n\) 到另一个点,设为关键点,并把子树内所有点标记了。注意这样需要额外空间。

也可以把关键点的虚树上的点也记作关键点。

只能处理链操作。

  • SDOI2022 无处存储

本题是树分块,那是因为本题卡空间

标签:lg,分块,sqrt,修改,数组,mathcal,数据结构,莫队,根号
From: https://www.cnblogs.com/haozexu/p/18368038

相关文章

  • CHC5223 Data Structures and Algorithms
    CHC5223DataStructuresandAlgorithms2023-2024-21of6AssignmentValue100%ofCourseworkResitIndividualworkBackgroundThesubwaysystemofacityisanetworkofundergroundorelevatedtrainsthatproviderapidtransitforpassengerswithint......
  • 数据结构与算法——滑动窗口
    目录引言核心思想使用场景解题步骤经典例题1、无重复字符的最长子串(LeetCode3)2、找到字符串中所有字母异位词(LeetCode438)引言定义:滑动窗口是指通过左右两个指针(或索引)来标记窗口的左右边界,随着指针的移动,窗口内的元素不断变化,从而实现对数组或字符串中连续子序列的......
  • 四十、【人工智能】【机器学习】- 梯度下降(Gradient Descent Algorithms)算法模型
     系列文章目录第一章【机器学习】初识机器学习第二章【机器学习】【监督学习】-逻辑回归算法(LogisticRegression)第三章【机器学习】【监督学习】-支持向量机(SVM)第四章【机器学习】【监督学习】-K-近邻算法(K-NN)第五章【机器学习】【监督学习】-决策树(......
  • 算法与数据结构——空间复杂度
    空间复杂度空间复杂度(spacecomplexity)用于衡量算法占用内存空间随着数据量变大时的增长趋势。这个概念与时间复杂度非常类似,只需将“运行时间”替换为“占用内存空间”。 算法相关空间算法在运行过程中使用的内存空间主要包括以下几种。输入空间:用于存储算法的输入数据。......
  • 【数据结构】详细介绍栈和队列,解析栈和队列每一处细节
    目录一.栈1. 栈的概念2. 栈的实现2.1栈的结构2.2初始化栈2.3入栈2.4出栈2.5获取栈顶元素2.6获取栈中有效个数2.7判断栈是否为空2.8销毁栈 二.队列1.队列的概念2.队列的实现 2.1队列的结构2.2队列初始化 2.3销毁队列 2.4入队列(队尾) ......
  • 算法与数据结构——时间复杂度
    时间复杂度运行时间可以直观且准确地反映算法的效率。要准确预估一段代码的运行时间,应该进行如下操作。确定运行平台,包括硬件配置、编程语言、系统环境等,这些因素都会影响代码的运行效率。评估各种计算操作的运行时间,例如加法操作需要1ns,乘法操作需要10ns,打印操作需要5ns等。......
  • 算法与数据结构——复杂度分析
    复杂度分析算法效率评估在算法设计中,我们追求以下两个层面的目标。找到问题解法:算法需要再规定的输入范围内可靠地求得问题的正确解寻求最优解法:同一个问题可能存在多种解法,我们希望找到尽可能高效的算法。也就是说,在能够解决问题的前提下,算法效率已经成为衡量算法优劣的主......
  • 数据结构(二)- 线性表
    数据结构(二)-线性表数据结构三要素——逻辑结构、数据的运算、存储结构;存储结构不同运算实现的方式不同;1.线性表的定义定义:线性表是具有相同数据类型的n(n>0)个数据元素的有限序列,其中n为表长,当n=0线性表是一个空表。一般表示为L=(a1,a2,…,ai,ai+1,…,an)......
  • Study Plan For Algorithms - Part5
    1.回文数题目链接:https://leetcode.cn/problems/palindrome-number/给定一个整数x,如果x是一个回文整数,返回true;否则,返回false。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。classSolution:defisPalindrome(self,x:int)->bool:str_x......
  • 基础数据结构回顾记录
    数组初始化两种方式声明和初始化数组——使用new关键字和使用大括号。refer:https://www.freecodecamp.org/chinese/news/java-array-declaration-how-to-initialize-an-array-in-java-with-example-code/先声明,后赋值//数组声明dateType[]nameOfArray=newdataType......