RMQ(转)

转载 2011年01月18日 13:12:00

  RMQ(Range Minimum/Maximum Query)问题是求区间最值问题。

你当然可以写个O(n) 的(怎么写都可以吧=_=),但是万一要询问最值1000000遍,估计你就要挂了。这时 候你可以放心地写一个线段树(前提是不写错)O(logn)的复杂度应该不会挂。但 是,这里有更牛的算法,就是ST算法,它可以做到O(nlogn)的预处理,O(1)!!! 地回答每个询问。

来看一下ST算法是怎么实现的(以最大值为例):

1.首先是预处理,用一个DP解决。设a[i]是要求区间最值的数列,f[i,j]表示 从第i个数起连续2^j个数中的最大值。例如数列3 2 4 5 6 8 1 2 9 7 ,f[1,0]表 示第1个数起,长度为2^0=1的最大值,其实就是3这个数。f[1,2]=5,f[1,3]=8, f[2,0]=2,f[2,1]=4……从这里可以看出f[i,0]其实就等于a[i]。

这样,Dp的状 态、初值都已经有了,剩下的就是状态转移方程。我们把f[i,j]平均分成两段(因 为f[i,j]一定是偶数个数字),从i到i+2^(j-1)-1为一段,i+2^(j-1)到i+2^j-1为 一段(长度都为2^(j-1))。用上例说明,当i=1,j=3时就是3,2,4,5 和 6,8,1,2这 两段。f[i,j]就是这两段的最大值中的最大值。于是我们得到了动规方程F[i,j] =max(F[i,j-1],F[i+2^(j-1),j-1]).

 

2.接下来是得出最值,也许你想不到计算出f[i,j]有什么用处,一般。想想计算max 还是要O(logn),甚至O(n)。但有一个很好的办法,做到了O(1)。还是分开来。如 在上例中我们要求区间[2,8]的最大值,就要把它分成[2,5]和[5,8]两个区间,因 为这两个区间的最大值我们可以直接由f[2,2]和f[5,2]得到。扩展到一般情况, 就是把区间[l,r]分成两个长度为2^n的区间(保证有f[i,j]对应)。直接给出表 达式: k:=(int)(ln(r-l+1)/ln(2)); ans:=max(F[l,k],F[r-2^k+1,k]); 这样就计算了从i开始,长度为2^t次的区间和从r-2^i+1开始长度为2^t的区间的最 大值(表达式比较烦琐,细节问题如加1减1需要仔细考虑

 

另外还有一篇《RMQ问题和LCA问题》 http://blog.sina.com.cn/s/blog_40d4357f010004ug.html

 

LCA转RMQ 模版及解析 + LCA倍增法模版

九野的博客,转载请注明出处:http://blog.csdn.net/acmmmm/article/details/15490519   LCA:  最近公共祖先 则 LCA(2,3) = 2 ;...
  • qq574857122
  • qq574857122
  • 2013年11月11日 23:21
  • 3967

LCA 转 RMQ算法 【总结】

首先,在你看这个算法之前,要确保你理解了RMQ的 ST 算法。 但是不理解没关系啊,提供通道:  点我 声明:这是方便我以后复习用的,所以总结不是特别详细。 LCA - 最近公共祖先:在有根树...
  • chenzhenyu123456
  • chenzhenyu123456
  • 2015年08月08日 18:48
  • 1393

RMQ(模板 ST 区间最值,区间频繁次数)

RMQ(模板 ST 区间最值,区间频繁次数)
  • u012860063
  • u012860063
  • 2014年11月03日 22:36
  • 1475

hdoj 3078 Network 【LCA 转 RMQ】 【记录前驱 求路径上第k大的点权】

Network Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total ...
  • chenzhenyu123456
  • chenzhenyu123456
  • 2015年08月09日 21:22
  • 383

LCA三种算法学习(离线算法tarjan+在线算法转rmq+在线倍增)例题poj1330、1470;hdu4547、2874

LCA 问题,即Least Common Ancestors(最近公共祖先)的意思是:给定一有根树,求其两个节点最近的公共祖先;节点的祖先即从节点至根的路径上的节点的集合。lca离线算法离线算法,就是...
  • abc13068938939
  • abc13068938939
  • 2016年07月24日 17:14
  • 910

LCA 转 RMQ算法 【知识点】

知识点 一
  • qq_37383726
  • qq_37383726
  • 2017年05月25日 20:55
  • 86

ZOJ 3195 Design the city LCA转RMQ

题意:给定n个点,下面n-1行 u , v ,dis 表示一条无向边和边权值,这里给了一颗无向树 下面m表示m个询问,问 u v n 三点最短距离 典型的LCA转RMQ   #include ...
  • qq574857122
  • qq574857122
  • 2013年08月16日 14:20
  • 1002

poj2763 Housewife Wind--LCA转RMQ

原题链接:http://poj.org/problem?id=2763 题意:n个点,n-1条点的连线,数据保证任意两点可达,无环,接下来q行操作,两种形式,0 u 表示查询该人到u的时间;...
  • LaoJiu_
  • LaoJiu_
  • 2016年09月23日 11:07
  • 242

poj1330 Nearest Common Ancestors LCA倍增法 或 LCA转RMQ

Language: Default Nearest Common Ancestors Time Limit: 1000MS   Memory Limit: 10000K ...
  • u011645923
  • u011645923
  • 2014年06月28日 15:15
  • 708

ZOJ 3195 LCA转RMQ

点击打开链接 题意:输入n,接下来n-1行,每行a,b,c代表a与b有一条权值为c的边,双向边,m次询问,问最短的距离使a,b,c可以联通 思路:LCA的模版题,没什么好说的,看理论的话网上好多本...
  • Dan__ge
  • Dan__ge
  • 2016年05月02日 19:37
  • 3563
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:RMQ(转)
举报原因:
原因补充:

(最多只允许输入30个字)