首页 > 其他分享 >【数据结构】【模板】莫队

【数据结构】【模板】莫队

时间:2024-07-22 09:19:44浏览次数:9  
标签:询问 times num 端点 数据结构 莫队 复杂度 模板 size

莫队

使用场景

  1. 离线算法;
  2. 区间询问不断修改。
  3. 能用 \(O(1)\) 的时间复杂度从 \([l, r]\) 到 \([l + 1, r]\) 或者 \([l, r - 1]\)。

原理

原问题可以转化为为建立一个坐标轴,对于一个询问 \((l, r)\),相当于点 \((l, r)\),从一个询问 \((a, b)\) 到 \((c, d)\),可以理解为点 \((a, b)\) 到 \((c, d)\) 的曼哈顿距离,\(Q\) 次询问的转移构成一棵生成树,当取曼哈顿距离的 MST(最小生成树),转移总代价最小。

实现

  1. 将询问离线,分块;
  2. 将询问排序,第一关键字左端点,第二关键字右端点;同一个块里面的,按照右端点排序;不是同一个块里面的,按照左端点排序。
  3. 维护双指针 \(x, y\),对于一次区间询问 \([qx, qy]\),将 \(x\) 移动到 \(qx\),将 \(y\) 移动到 \(qy\) 即可得到答案。

注意:应该先加后减。

时间复杂度

对于右指针 \(y\):

对于同一个块的询问,\(y\) 最多跑 \(n\) 次,每块换 \(1\) 次,最多换 \(O(n)\),总共 \(O(num \times n)\),\(num\) 为块的数量。

对于左指针 \(x\):

对于同一个块中的询问,\(x\) 的单词询问 \(O(size)\),\(size\) 为块长,总时间 \(O(q \times size)\)。

所以总时间复杂度为 \(O(q\times size + num \times n)\)。

奇偶优化

当两个询问的左端点在同一块时,若处于奇数块,则右端点升序,若左端点处于偶数块,则右端点降序。

例题

标签:询问,times,num,端点,数据结构,莫队,复杂度,模板,size
From: https://www.cnblogs.com/Yuan-Jiawei/p/18315363

相关文章

  • 【图论】【模板】差分约束系统
    差分约束系统差分约束系统是将不等式组的问题转化为图论问题。前置知识判断负环例题P5960【模板】差分约束算法思路我们将\(x_u-x_v\ley_u\)换为\(x_u\lex_v+y_u\)。然后我们建立一条连接\(v,u\)(注意是\(v,u\)不是\(u,v\))权值为\(y_u\)的边。我们发......
  • 【图论】【模板】最长路、最短路
    最短路Dijkstra算法思路Dijkstra算法,采用贪心思想,在某一时刻如果\(dis\)数组中\(dis_u\)最小,那么就固定\(u\),\(dis_u\)一定是\(1\rightarrowu\)的最短路径,然后我们再通过\(u\)更新与\(u\)有边相连的\(v\),如果\(dis_v>dis_u+w\),那么\(dis_v=dis_u+w\)......
  • 【图论】【模板】判断负环
    使用SPFA算法判断负环前言判断负环是属于判定性的问题,常与二分结合起来。例题AcWing852.spfa判断负环思路可以使用SPFA进行判断。因为两点之间至多有\(n-1\)条边,所以当一个点的最短路径经过的边数大于等于\(n\)时,说明有负环。代码#include<bits/stdc++.h>......
  • 【搜索】【模板】模拟退火
    前置知识自然对数、分数次幂、概率。前言模拟退火可以在我们想不到题目正解的时候试一试其实就是骗分方法。因为纯随机得出正确答案的概率非常低,所以我们就可以加一定的优化,使找到答案概率增大。算法思想温度(步长):每次选择一个范围进行搜索,在搜索过程中范围不断缩小,最后到很......
  • C++标准模板(STL)- 概念库 (C++20) - 指定一个类型派生自另一类型 - (std::derived_from)
    概念库提供基础语言概念的定义,它们能用于进行模板实参的编译时校验,以及基于类型属性的函数派发。这些概念在程序中提供等式推理的基础。标准库中的大多数概念一同加上了语法及语义要求。通常,编译器只能检查语法要求。若在使用点语义要求未得到满足,则程序为病式,不要求诊断。......
  • 爱思唯尔模板 LATEX 表格标题左对齐
    爱思唯尔模板LATEX表格标题左对齐1.问题描述2.解决方法1.问题描述若出现表格标题如下居中形式,想要变成左对齐的形式。2.解决方法在\begin{document}前面加上\usepackage[font=small,labelfont=bf,labelsep=none]{caption}\captionsetup[table]{labelforma......
  • 数据结构——李超线段树 学习笔记
    数据结构——李超线段树学习笔记维护直线考虑线段树维护区间最优线段。其中,最优线段指的是,在区间\([l,r]\)中,中点\(mid\)处最优的线段。我们称一个线段在单点更优/最优,显然,是指此处的函数值更大。我们下面称一个线段在区间内更优/最优,是指在中点处的比较。......
  • 算法设计与数据结构系列【超详细、超全面、小白可入,期末复习】持续更新中...
    算法设计与数据结构系列【超详细、超全面、小白可入,期末复习】持续更新中…24.07.21代码采用语言:Java1、位运算(BitwiseOperation)常见操作:与(&)、或(I)、非(~)、异或(^)移位运算:>>和<<分别为左移和右移>>>运算符:用0填充高位,>>用符号位填充高位,没有<<<运算符真值表ab~a~b......
  • 数据结构:栈的基本概念、顺序栈、共享栈以及链栈
    相关概念栈(Stack)是只允许在一端进行插入或删除操作的线性表。栈顶(Top):线性表允许插入删除的那一端。栈底(Bottom):固定的,不允许进行插入和删除的另一端。栈的基本操作InitStack(&S):初始化一个空栈S。StackEmpty(S):判断一个栈是否为空,若栈S为空则返回true,否则返回false。......
  • 初阶数据结构的实现2 双向链表
    1.双向链表1.1概念与结构1.2实现双向链表1.2.1定义程序目标#define_CRT_SECURE_NO_WARNINGS1#pragmaonce#include<stdio.h>#include<assert.h>#include<stdlib.h>#include<stdbool.h>typedefintLTDateType;//定义双向链表结构typedefstructListNode{......