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

 

相关文章推荐

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
  • 197

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

Language: Default Nearest Common Ancestors Time Limit: 1000MS   Memory Limit: 10000K ...

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
  • 3526

HDU 2874 LCA转RMQ+并查集

点击打开链接 题意:问两个城市是否相连,不相连输出Not connected,否则输出两个城市间的最短距离 思路:用并查集判断两个城市的连通性,如果联通则做法和LCA一样,但是注意的一点是地图不连...
  • Dan__ge
  • Dan__ge
  • 2016年05月02日 20:25
  • 3673

ZOJ 3195 Design the city LCA转RMQ

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

HDU 5266 pog loves szh III (线段树+在线LCA转RMQ)

题目地址:HDU 5266 这题用转RMQ求LCA的方法来做的非常简单,只需要找到l-r区间内的dfs序最大的和最小的就可以,那么用线段树或者RMQ维护一下区间最值就可以了。然后就是找dfs序最大的...

POJ 1986 Distance Queries (在线LCA转RMQ)

题目地址:POJ 1986 纯模板题。输入的最后一个字母是多余的,完全不用管。还有注意询问的时候有相同点的情况。 代码如下:#include #include #include #inclu...

HDU 2586 LCA转RMQ

点击打开链接 题意:就是问两个节点间的距离 思路:又切了一道模版水题,不解释了,看不懂变量含义的可以看我写的这篇,解释的比较详细ZOJ 3195#include #include #inclu...
  • Dan__ge
  • Dan__ge
  • 2016年05月02日 20:00
  • 3827

LCA转RMQ

转自:http://blog.sina.com.cn/s/blog_5ceeb9ea0100kynz.html LCA(a,b)转RMQ就是把从节点a到节点b的这条路径记下来(用df...

HDU 4297 One and One Story 树lca转rmq 并查集维护根节点环

题意:给定一个有向图,每个节点只有一条出边,现在两个人在两个节点沿着有向边走,按照题意输出相遇时两个人走的路径。 题解:这个有向图很特别,由于每个节点只有一条出边,所以如果形成一个环的话就只能有指向...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:RMQ(转)
举报原因:
原因补充:

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