st表--目的是解决RMQ问题(多次询问区间最值) 既然叫‘表’,那肯定要打个表,然后你问什么,我就在表里找就可以了,这样,询问时的时间复杂度就是O(n)。 妈妈再也不用担心我会超时了 设你把一个需要处理的序列存储在a [ i ] 中 s tiao表,首先要声明一个二维数组jump[i][j] or ...
分类:
其他好文 时间:
2019-01-20 15:56:59
阅读次数:
526
`RMQ(Range Minimum/Maximum Query)`,即区间最值问题。 对于长度为 的数列 ,回答若干查询 `RMQ(A,i,j)(i,j &A) { int n=A.size(); for (int i=0; i ...
分类:
其他好文 时间:
2018-12-22 19:35:23
阅读次数:
257
所谓$RMQ$,就是$Range$ $Minimum/Maximum$ $Query$,区间最值查询。我们可以用 "线段树" 维护,也可以使用笛卡尔树将其转化为求$lca$的问题。但是后者一般不常用,更为常用的,是家喻户晓的$st$算法。由于$RMQ$问题大多不是赤裸裸的$RMQ$,而是经过了伪装。 ...
分类:
其他好文 时间:
2018-12-16 23:38:33
阅读次数:
174
RMQ是询问某个区间的最大值或最小值的问题,主要求解方法之一ST算法; ST算法其实是倍增思想的产物,等下看代码实现就很明显了 ST算法通常用在要多次询问一些区间的最值的问题中,相比于线段树,它的程序实现更简单,运行速度更快; ST算法没有修改操作(或者说不擅长动态修改) ST算法流程: 预处理 : ...
分类:
编程语言 时间:
2018-11-02 23:44:17
阅读次数:
171
此题还有LCA+tarjin离线查询做法,详见这里 关于ST表 解决RMQ问题,dp[i][j]表示从第i位开始长度为(1<<j)的区间的最值 维护的时候采用倍增思想,维护dp[i][j+1]=opt(dp[i][j],dp[i+(1<<j)][j]) 查询的时候,两端点为l,r,则长度len=r- ...
分类:
其他好文 时间:
2018-10-17 11:12:11
阅读次数:
177
给出一个有N个数的序列,编号0 - N - 1。进行Q次查询,查询编号i至j的所有数中,最大的数是多少。 例如: 1 7 6 3 1。i = 1, j = 3,对应的数为7 6 3,最大的数为7。(该问题也被称为RMQ问题) 例如: 1 7 6 3 1。i = 1, j = 3,对应的数为7 6 3 ...
分类:
其他好文 时间:
2018-10-14 19:02:27
阅读次数:
161
参考博客 仔细想一想:最近的公共祖先,其实,搜索时回朔,连通这两点,那深度最低肯定是最近的公共祖先啊。 那这样就可以变成RMQ问题了。 ...
分类:
其他好文 时间:
2018-10-05 18:48:42
阅读次数:
231
ST表 Introduction 最近看到ST表,似曾相识,然后简单了解了一下 比较妙妙的用空间换时间 Body 事实上,中间的 $$f[i][j] = max\{f[i,i+2^j 1]\}$$ 所以说 这样来说: $$f[i][j] = max(f[i][j 1],f[i+2^{j 1}][j ...
分类:
其他好文 时间:
2018-09-15 22:02:58
阅读次数:
159
全网好像就只有劼和manchery写了博客的样子……;正解可能是最大流?但是仔细特判也能过 题目描述 RMQ问题即区间最值问题是一个有趣的问题。 在这个问题中,对于一个长度为 n 的排列,query(l,r) 将返回 al,?,ar 中的最大值。 如对于 {3,1,4,2,5},query(2,4) ...
分类:
其他好文 时间:
2018-09-09 16:50:00
阅读次数:
200