既然都来问 O(n)-O(1) 的 RMQ 了,那么 ST 表应当是已经知道了的。
众所周知,ST 表是 O(nlog n) 预处理 O(1) 查询的数据结构,那么如果我们将整个序列分成 O(n/log n) 个块,每一个块大小是 (log n)/2,那么我们就可以在 O(n) 的时间内预处理,并且通过预处理块内的前缀最值和后缀最值来做到 O(1) 查询跨块的询问。
接下来考虑块内的询问,我们考虑将序列建笛卡尔树,然后以深度为权值求最值,容易发现与原问题等价。
所以我们可以预处理所有的 2^((log n)/2)=\sqrt{n} 种 ±1 的状态中最小值所在位置,然后就可以 O(1) 查询块内的最值了。
顺带推销自己的博客?
求RMQ O(n)-O(1)超详细讲解!
这里就说得到ST算法:询问时取k=ln(j-i+1)\/ln2即可,那么可以令A为i到2^k的块,和B为到2^k结束的长度为2^k的块;那么A,B都是区间[i,j]的子区间,所以即求A区间的最小值和B区间的最小值的最小值。这个时候动态规划为:RMQ(i,j)=min(F[i,k],F[j-2^k+1,k])。
算法总结--ST表
在计算机科学领域,RMQ(Range Minimum\/Maximum Query)问题是一个常见的查询任务。它的基本要求是在给定的数列中,找出某个范围内的最小或最大值。在动态场景中,如线段树可以有效解决RMQ问题,提供O(log(n))的时间复杂度。然而,对于静态场景,ST表(Segment Table)提供了更快的O(1)查询速度。ST表...
rmq标准算法
对于A数组,由于相邻元素差的绝对值为1,我们可以将其分解为长度为l=[(log N)\/2]的块。处理块内查询时,A'数组和B数组的处理时间复杂度为O(N)。预处理后,块内查询可在O(1)时间内完成,块间查询则分解为块内查询和RMQ,总复杂度也是O(1)。总结,我们设计了一个预处理时间O(n)、查询时间O...
pascal的快速幂的矩阵乘法,求详解和具体实现。
我们可以用上面的方法二分求出任何一个线性递推式的第n项,其对应矩阵的构造方法为:在右上角的(n-1)*(n-1)的小矩阵中的主对角线上填1,矩阵第n行填对应的系数,其它地方都填0。例如,我们可以用下面的矩阵乘法来二分计算f(n) = 4f(n-1) - 3f(n-2) + 2f(n-4)的第k项: 利用矩阵乘法求解线性递...
rmqST算法
通常,计算最大值需要O(logn)或O(n)的时间复杂度。然而,通过ST算法,我们可以做到O(1)的复杂度。以计算区间[2,8]的最大值为例,将其分为[2,5]和[5,8],直接利用f[2,2]和f[5,2]得到。这种方法可以推广到一般情况,将区间[l,r]划分成长度为2^n的两个子区间,确保每个子区间有对应f...
后缀数组最长公共前缀
RMQ可以通过预处理线段树或静态排序树在O(nlogn)时间内完成,或者使用RMQ标准算法在O(n)时间内预处理,查询时间常数级。通过计算后缀数组的经验,我们可以利用后缀之间的关联,发现height数组的一个性质:对于i>1且Rank[i]>1,height[i]大于等于height[i-1]-1。根据这个性质,我们可以设计一个O(n)...
interview-o 代码用法
interview-o代码的用法:interview-o给定链表的头指针和一个结点指针,在O(1)时间内删除该结点。需要注意的是,这里只是删除该结点的步骤为O(1),而不是查找到该结点的时间复杂度。求解思想:一般来说,我们删除链表中的一个结点是将在它前驱结点上进行操作,将它前驱结点的next指针指向K的后继节点,K...
求大神给一个windows8.1企业版安装密匙
Windows 8.1 & Windows 8 Pro \/ Pro WMC 离线激活零售版密钥:slmgr.vbs -ipk CGWVF-N3VMK-CVG7W-MBB9Y-MY2KV slmgr.vbs -ipk D46QW-N3M4H-RY93J-DPMPY-43G67 slmgr.vbs -ipk D66NY-H99YQ-9MPFY-G2YF3-973G7 slmgr.vbs -ipk DBTMW-N29V3-V6XJ7-4RQXD-4F9T7 slmgr.vbs...
请教做ACM的常用算法..还是菜鸟
(RMQ+dfs)).(poj1330) (3)双端队列和它的应用(维护一个单调的队列,常常在动态规划中起到优化状态转移的 目的). (poj2823) (4)左偏树(可合并堆). (5)后缀树(非常有用的数据结构,也是赛区考题的热点). (poj3415,poj3294) 四.搜索 (1)较麻烦的搜索题目训练(poj1069,poj3322,poj1475,poj1924...
我是个ACM菜鸟,希望学到东西,为了下一代,把你的功力传给我吧,如果我...
因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打 出来。1.最短路(Floyd、Dijstra,BellmanFord)2.最小生成树(先写个prim,kruscal要用并查集,不好写)3.大数(高精度)加减乘除 4.二分查找. (代码可在五行以内)5.叉乘、判线段相交、然后写个凸包.6.BFS、DFS,...