ST算法(Sparse Table)

RMQ问题:

给定一个序列,每次询问一个区间最小值 / 最大值。

没有修改。

//拿区间最大值来举例。
memset(ans, -INF, sizeof(ans));

for (int i = 1; i <= n; i++)
        ans[i][0] = a[i];

for (int j = 1; (1<<j) <= n; j++) //枚举长度为2^j的区间
        for (int i = 1; i+(1<<j)-1 <= n; i++)  //枚举区间起点
                ans[i][j] = max(ans[i][j-1], ans[i+(1<<(j-1))][j-1]);  
          //显然,长度为2^j的区间由2^(j-1)的区间更新。

for (int i = 1; i <= q; i++)
{
        int l, r, k = 0;
        scanf("%d%d", &l, &r);
        while((1<<(k+1)) <= r-l+1) k++;  
      //若2^k+1还是不超过所求区间的长度,那么说明k可以继续加1
        printf("%d\n", max(ans[l][k], ans[r-(1<<k)+1][k]));  
      //两个区间可能有相交的部分,但由于是求最值,所以无影响。
}

  

原文地址:https://www.cnblogs.com/ruthank/p/9460401.html

时间: 2024-10-11 07:51:46

ST算法(Sparse Table)的相关文章

[总结]RMQ问题&amp;ST算法

目录 一.ST算法 二.ST算法の具体实现 1. 初始化 2. 求出ST表 3. 询问 三.例题 例1:P3865 [模板]ST表 例2:P2880 [USACO07JAN]平衡的阵容Balanced Lineup 一.ST算法 ST算法(Sparse Table Algorithm)是用于解决RMQ问题(区间最值问题,即Range Maximum/Minimum Question)的一种著名算法. ST算法能在复杂度为\(O(NlogN)\)的预处理后,以\(O(1)\)的复杂度在线处理序列区

RMQ(ST算法)

RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列a,回答若干询问RMQ(A,i,j)(i, j<=n),返回数列a中下标在i,j之间的最小/大值.如果只有一次询问,那样只有一遍for就可以搞定,但是如果有许多次询问就无法在很快的时间处理出来.在这里介绍一个在线算法.所谓在线算法,是指用户每输入一个查询便马上处理一个查询.该算法一般用较长的时间做预处理,待信息充足以后便可以用较少的时间回答每个查询.ST(Sparse Table

RMQ问题ST算法

1. 概述 RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间的最小/大值.这两个问题是在实际应用中经常遇到的问题,下面介绍一下解决这两种问题的比较高效的算法.当然,该问题也可以用线段树(也叫区间树)解决,算法复杂度为:O(N)~O(logN),这里我们暂不介绍. 2.RMQ算法 对于该问题,最容易想到的解决方案是遍历,复杂度是O(n).但当数据量

RMQ算法 (ST算法)

 概述: RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间的最小/大值.对于一次查询,可以暴力地O(n),但是当查询次数很多的时候,这样的暴力就无法进行了.这时我们可以通过RMQ算法来解决这个问题. RMQ(ST):(关于学习RMQ的博客:框架即讲解比较详细 , 具体代码比较好) ST(Sparse Table)算法是一个非常有名的在线处理RMQ

51NOD1174 区间最大数 &amp;&amp; RMQ问题(ST算法)

RMQ问题(区间最值问题Range Minimum/Maximum Query) ST算法 RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列a,回答若干询问RMQ(A,i,j)(i, j<=n),返回数列a中下标在i,j之间的最小/大值.如果只有一次询问,那样只有一遍for就可以搞定,但是如果有许多次询问就无法在很快的时间处理出来.在这里介绍一个在线算法.所谓在线算法,是指用户每输入一个查询便马上处理一个查询.该算法一般用较长

学习笔记 ST算法

[引子]RMQ (Range Minimum/Maximum Query)问题: 对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,也就是说,RMQ问题是指求区间最值的问题. {方法} 1.朴素(即搜索),O(n)-O(qn) online. 2.线段树,O(n)-O(qlogn) online. 3.ST(实质是动态规划),O(nlogn)-O(q) online. ST算法(Sparse Table),以求最大值为例,设d[i,

RMQ问题ST算法 (还需要进一步完善)

/* RMQ(Range Minimum/Maximum Query)问题: RMQ问题是求给定区间中的最值问题.当然,最简单的算法是O(n)的,但是对于查询次数很多(设置多大100万次),O(n)的算法效率不够.可以用线段树将算法优化到O(logn)(在线段树中保存线段的最值).不过,Sparse_Table算法才是最好的:它可以在O(nlogn)的预处理以后实现O(1)的查询效率.下面把Sparse Table算法分成预处理和查询两部分来说明(以求最小值为例). 预处理: 预处理使用DP的思

图论学习十之Sparse table

ST表 无修改区间最值询问问题 • 给出一个数组a[1..N] • Q个询问,每次询问每次询问区间[x,y]最大值. • N,Q <= 100000 St表的递推 • 用st[k][i]表示从i开始连续2^k个元素的最值. • 得出递推式 • st[k+1][i]=max(st[k][i], st[k][i+2^k]);(假设求最大值) • 从小到大枚举k,再枚举i. • 那么预处理出上面这个数组的复杂度为O(nlogn) .   询问操作 • 找出最大的k使得 2^k<=y-x+1 • 注意

区间最值ST算法

题目描述 给出一大串数字(编号为1到N),给定M个询问,每次询问两个数字A,B,要求A到B这段区间内的最大数. 输入输出格式 输入格式: 一个整数N表示数字的个数,接下来一行为N个数.第三行读入一个M,接下来M行,每行都有两个整数A,B. 输出格式: 输出共M行,每行输出一个数. 输入输出样例 输入样例#1: 6 34 1 8 123 3 2 4 1 2 1 5 3 4 2 3 输出样例#1: 34 123 123 8 说明 对于30%的数据,1<=N<=10000,1<=M<=1

RMQ问题——ST算法

什么是RMQ.ST:RMQ(Range Minimum/Maximum Query)问题,即求区间的最值.可以写一个线段树来实现,但是每次查询的时间复杂度为O(log n),若查询次数过多则可能超时.ST算法是一种离线算法,经过O(nlogn)的预处理后,可以在O(1)的时间复杂度内进行查询,缺点是无法对数据做出修改. 算法实现: 初始化:用dp实现初始化.a[]为原始数据数组f,[i][j]表示从i向后的2j个数字中的最值.显然f[i][0]=a[i]; 我们将f[i][j]分为两段,一段为a