首页 > 其他分享 >RMQ

RMQ

时间:2024-02-23 12:00:38浏览次数:14  
标签:RMQ frac log 询问 ST 区间

这里会记一些不那么基础的 RMQ 算法,同时也会向外拓展到增量法规建笛卡尔树之类的东西。

首先是基础的 RMQ,静态可以用 ST 表做到 \(O(n\log n)-O(1)\),动态可以用线段树做到 \(O(n)-O(\log n)\),当然还有一些奇技淫巧可以用 ST 表维护特殊的动态 RMQ。

现在来看不基础的。

询问区间定长

所有询问的区间长度均为 \(l\)。

单调队列不断右移可以做到 \(O(n)-O(1)\),离线会更方便一点。

朴素随机区间询问

考虑分块,块长 \(b\),共 \(\lceil \frac{n}{b}\rceil\) 块。

\(O(n)\) 维护出每块的最大值,用 ST 表对块做 RMQ,于是对于询问时的整块可以 \(O(1)\) 得到答案。

对于散块,可以线性维护每块前缀后缀最大值,同样做到 \(O(1)\) 询问。

总体时间复杂度 \(O(n+\frac{n}{b}\log\frac{n}{b})-O(1)\),但是注意到询问可能在同一个块内,此时只能 \(O(b)\) 回答询问

但由于是随机区间,在同一个块内的期望复杂度为 \(O(\frac{b^2}{n})\),所以询问是 \(O(q+q\frac{b^2}{n})\)。

非朴素区间询问

标签:RMQ,frac,log,询问,ST,区间
From: https://www.cnblogs.com/BYR-KKK/p/18029216

相关文章

  • RMQ
    区间最大最小值(RMQ)st表利用min,max区间合并是可重的,倍增预处理时间复杂度\(O(n\logn+q)\)空间复杂度\(O(n\logn)\)线段树二进制划分区间时间复杂度\(O(n\logn)\)methodoffourrussians建立笛卡尔树,求欧拉序,序列中相邻的两个元素绝对值为1,分块RMQ,状压,然后......
  • RMQ问题
    #include<bits/stdc++.h>usingnamespacestd;#defineintlonglongchar*p1,*p2,buf[100000];#definenc()(p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)intread(){intx=0,f=1;charch=nc();while(ch<48......
  • ST表 RMQ(区间最大/最小值查询)问题
    主要应用倍增思想预处理:O(nlogn)查询:O(1)f[i][j]是以i为起点,长度为2j的区间中的最大值(一个点一个单位长度,不是一条线段)区间终点:i+2j-1<=n区间长度的指数k=log2(r-l+1),只有当r-l+1为2n-1时是恰好分割,其他时候有重叠,但问题不大代码 #include<iostream>#include<cstring>#......
  • #P1042. 静态RMQ[ST表模板]
    题意是:给定一个长度为N的数列,和M次询问,求出每一次询问的区间内数字的最大值。ST表的基本功能是对区间进行查询,其核心使用的是倍增的思想f[i][k]:意思是从第i个数开始往后2^k个数f[i][k]=max(f[i][k-1],f[i+2^k-1][k-1])求【l,r】区间max(f[i][k],f[r-2^k+1][k])#define......
  • CF803G Periodic RMQ Problem
    题目描述给你一个序列\(a\)让你支持\(1\)\(l\)\(r\)\(x\)区间赋值\(2\)\(l\)\(r\)询问区间最小值我们觉得这个问题太水了,所以我们不会给你序列\(a\)而是给你序列一个长度为\(n\)的序列\(b\),把\(b\)复制粘贴\(k\)次就可以得到\(a\)\(n\le10^5,k\le10^4,q\le10......
  • RMQ模板
    #include<cstdio>#include<cstring>#include<algorithm>#include<cmath>usingnamespacestd;constintN=200010,M=18;intn,m;intw[N];intlg[N];intf[N][M];//查询区间最值//预处理f数组voidinit(){ lg[1]=0; for(inti=2;i&l......
  • P6109 [Ynoi2009] rprmq1 题解-猫树+Segment Tree Beats
    20231025P6109[Ynoi2009]rprmq1题解-猫树+SegmentTreeBeats不愧是学长出的题。。。让我更深刻地理解了猫树。Statement传送门有一个\(n\timesn\)的矩阵\(a\),初始全是\(0\),有\(m\)次修改操作和\(q\)次查询操作,先进行所有修改操作,然后进行所有查询操作。一次修......
  • RMQ
    P3865【模板】ST表利用倍增f[i][j]表示,范围[i,i+2^(j)-1]内的最大值是多少点击查看代码#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+10;intf[N][22];intmain(){ ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); intn,m; cin>>n>>......
  • 分块+ST的RMQ
    期望\(O(n)-O(1)的RMQ\)#include<bits/stdc++.h>#defineintlonglong#defineF(i0,i1,i2)for(inti0=(i1);i0<=(i2);++i0)usingnamespacestd;inlineintrd(){ intx=0,f=0;charch=getchar(); while(!isdigit(ch)){if(ch=='-')f=1;ch=getchar(......
  • RockerMq发送消息之顺序消息
    顺序消息        消息有序指的是可以按照消息的发送顺序来消费(FIFO)。RocketMQ可以严格的保证消息有序,可以分为分区有序或者全局有序。        顺序消费的原理解析,在默认的情况下消息发送会采取RoundRobin轮询方式把消息发送到不同的queue(分区队列);而消费消......