首页 > 编程语言 >莫队算法

莫队算法

时间:2024-09-10 14:13:15浏览次数:9  
标签:frac 答案 询问 算法 端点 莫队 复杂度

莫队算法

普通莫队

形式:给定一个长度为 \(n\) 的序列,有 \(q\) 次询问,每次询问给出 \(l,r\),问区间 \([l,r]\) 的答案。

要求:询问必须离线,且从区间 \([l,r]\) 转移到区间 \([l+1,r],[l-1,r],[l,r+1],[l,r-1]\) 的时间复杂度是 \(O(1)\) 的。

做法:关于 \(l\) 对询问分块,块长为 \(T\),每个块内对 \(r\) 从小到大排序。按照一个个块的顺序处理询问,移动左右端点从一个询问转移到另一个询问,移动时维护区间答案。

时间复杂度:块内左端点每次跳 \(O(T)\),一共有 \(q\) 个左端点,一个块右端点会移动 \(O(n)\),一共有 \(\frac{n}{T}\) 个块,不同块间转移是 \(O(n)\) 的,一共有 \(\frac{n}{T}\) 个块。总时间复杂度是 \(O(\frac{n^2}{T}+qT)\),根据基本不等式,时间复杂度 \(\le \sqrt{n^2q}=n\sqrt{q}\),块长 \(T\) 取 \(\frac{n}{\sqrt{q}}\)。时间复杂度 \(O(n\sqrt{q})\)。

例题:P1494 [国家集训队] 小 Z 的袜子

奇偶优化:奇数块 \(r\) 从小到大排序,偶数块 \(r\) 从大到小排序。

带修改莫队

问题:给定一个长度为 \(n\) 的序列,有 \(q\) 次询问,每次询问有两种:

  1. 给出 \(l,r\),问区间 \([l,r]\) 的答案。
  2. 把 \(a_i\) 改成 \(x\)。

用数据结构预处理序列上每个点每个时间是什么。显然用 mutiset 是好做的。

把每次询问答案看作三维数对 \((l,r,t)\)。离线做莫队。

对 \(l\) 分块,块长为 \(T\),每个块内对 \(r\) 分块,块长为 \(T\),按 \(T\) 从小到大排序。每个小块 \(t\) 最多移动 \(q\) 次,一共 \(\frac{n^2}{T^2}\) 个小块。每个小块内一次转移 \(l,r\) 最多移动 \(T\) 次,一共 \(q\) 次转移。不同小块间转移一次 \(r\) 移动 \(T\) 次,一共 \(\frac{n^2}{T^2}\) 个小块。不同大块间转移一次 \(l\) 移动 \(T\) 次,一共 \(\frac{n}{T}\) 个大块。总时间复杂度是 \(O(\frac{n^2q}{T^2}+qT+\frac{n^2}{T}+n)=O(\frac{n^2q}{T^2}+qT+n)\)。

一般来讲,\(T\) 取 \(n^{\frac{2}{3}}\) 时复杂度最优。总复杂度为 \(O(qn^{\frac{2}{3}})\)。

回滚莫队

问题:给定一个长度为 \(n\) 的序列,有 \(q\) 次询问,每次询问给出 \(l,r\),问区间 \([l,r]\) 的最大/最小/mex 值。

例如求区间 mex 值,我们发现区间减少一个数答案是好维护的,但是增加一个数答案不好维护。

于是还是按照 \(l\) 分块,块长为 \(T\),每块的询问左端点满足在区间 \([l_{min},l_{max}]\)。

我们在每个块中按 \(r\) 从大到小排序,预处理所有区间 \([l_{min},n]\) 的答案,对于每个询问,我们只需要从 \(n\) 开始不断向左移动右端点,移完存档一下目前的答案,然后向右移动左端点,求出询问的答案。之后回到存档,算下一个答案即可。

时间复杂度分析和普通莫队一样。

标签:frac,答案,询问,算法,端点,莫队,复杂度
From: https://www.cnblogs.com/liyixin0514/p/18406306

相关文章

  • 聚类算法 0基础小白也能懂(附代码)
    聚类算法0基础小白也能懂(附代码)原文链接啥是聚类算法聚类(Clustering)是最常见的无监督学习算法,它指的是按照某个特定标准(如距离)把一个数据集分割成不同的类或簇,使得同一个簇内的数据对象的相似性尽可能大,同时不在同一个簇中的数据对象的差异性也尽可能地大。也即聚类后同一类......
  • 最长匹配算法
    1、实例2、详解1)确定目的地址:192.168.2.22)查找路由表中:目的网路/掩码第一步:目的地址与掩码进行二进制与运算  11000000101010000000001000000010&11111111111111110000000000000000                         ......
  • 第J3周:DenseNet算法实战与解析(TensorFlow版)
    >-**......
  • 【Python】排序算法及二叉树讲解(冒泡 选择 插入 二分查找 二叉树的广度优先和三种深
    排序算法​所谓排序,使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作​排序算法,就是如何使得记录按照要求排列的方法​排序算法在很多领域是非常重要​在大量数据的处理方面:一个优秀的算法可以节省大量的资源。​在各个领域中考虑到数据的......
  • 【算法题】13.罗马数字转整-力扣(LeetCode)
    【算法题】13.罗马数字转整-力扣(LeetCode)1.题目下方是力扣官方题目的地址13.罗马数字转整数罗马数字包含以下七种字符:I,V,X,L,C,D和M。字符数值I1V5X10L50C100D5......
  • 代码随想录算法 - 二叉树
    题目1226.翻转二叉树给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。示例1:输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]示例2:输入:root=[2,1,3]输出:[2,3,1]示例3:输入:root=[]输出:[]提示:树中节点数目范围在[0,100]内-100<=Node.val......
  • 看demo学算法之 自编码器
    大家好,这里是小琳AI课堂!今天我们来聊聊自编码器。......
  • 一文轻松搞定 tarjan 算法(二)(附带 tarjan 题单)
    完结篇:tarjan求割点、点双连通分量、割边(桥)(附40道很好的tarjan题目)。上一篇(tarjan求强连通分量,缩点,求边双)tarjan求割点还是求强联通分量的大致思路捏.算法思路:我们把图中的点分为两种:每一个联通子图搜索开始的根节点和其他点。判断是不是割点的方式如下:对于根......
  • 文心一言 VS 讯飞星火 VS chatgpt (340)-- 算法导论23.1 9题
    九、设为的一棵最小生成树,设为由为由是连通的,则的一棵最小生成树。如果要写代码,请用go语言。文心一言:要证明如果是是诱导的的子图,即诱导的的子图,即是连通的,即:由于诱导的的子图,并且是的生成树,因此是:假设存在。由于是(即中不在的权重加上的权重,由于......
  • (Matlab实现)K-means算法及最佳聚类数目的确定
      目录摘要:1.K-means算法2.Calinski-HarabaszCriterion(卡林斯基-哈拉巴斯指标,CH值)3.Davies-BouldinCriterion(戴维斯-博尔丁指标,DB值)4.GapValue(Gap值)5.SilhouetteCoefficient(轮廓系数)6.基于Matlab的K-means聚类及最佳聚类数选取结果:各种指标评价图像:K-means聚类......