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(Sparse Table)算法是一个非常有名的在线处理RMQ问题的算法,它可以在O(nlogn)时间内进行预处理,然后在O(1)时间内回答每个查询。

    假设a数组为:

    1, 3, 6, 7, 4, 2, 5

    1.预处理

    设dp[i][j]表示从第i位开始连续2^j个数中的最大值。例如dp[2][1]为第2位数开始连续2个的数的最大值,即6, 4之间的最大值,即mn[2][1] = 4。我们先初始化dp[0...n-1][0]为a数组中的值,之后我们很容易想到递推方程:

    dp[i][j] = max(dp[i][j - 1], dp[i + (1 << j - 1)][j - 1])


20000> 2**14 > 10000
  30000> 2**15 > 40000
  60000> 2**16 > 70000

1 for(int j = ; j < ; j ++)
for(int i = ; i + ( << j) <= n + ; i ++)
dp[i][j] = max(dp[i][j - ], dp[i + ( << (j - ))][j - ]);

    2.查询

    假设我们需要查询[lo, hi]之间的最值,我们令k = log2(hi-lo+1)

    由于k是 log2(hi-lo+1)向下取整得到的,所以无法完全覆盖lo到hi

    只要保证lo + k 的长度大于lo到hi的长度的1/2即可使用:RMQ[l, r] = min(dp[l][k], dp[r - (1 << k) + 1][k]);

    

    因为不难看出,对于任意长度len,(int)log2(len) ** 2 > len/2

    所以最终代码如下:

 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
/*
20000> 2**14 > 10000
30000> 2**15 > 40000
60000> 2**16 > 70000
*/
int N[]; int mx[][]; int main()
{
int n,q;
scanf("%d", &n);
for(int i=;i<n;i++)
{
scanf("%d", &N[i]);
}
// ------------------------------- memset(mx, , sizeof(mx));
for(int i=;i<n;i++)
{
mx[i][] = N[i];
} for(int i=;i<;i++)
{
for(int j=;j+(<<i)-<n;j++)
{
mx[j][i] = max(mx[j][i-], mx[j+(<<i-)][i-]);
}
} // -------------------------------
scanf("%d", &q);
int lo, hi;
for(int i=;i<q;i++)
{
scanf("%d%d", &lo, &hi);
int k = (int)log2((double)(hi-lo+));
int ans = max(mx[lo][k], mx[hi-(<<k)+][k]);
printf("%d\n", ans);
}
}

当然也可以用线段树解决

51NOD1174 区间最大数 && RMQ问题(ST算法)的更多相关文章

  1. RMQ的ST算法

    ·RMQ的ST算法    状态设计:        F[i, j]表示从第i个数起连续2^j个数中的最大值    状态转移方程(二进制思想):        F[i, j]=max(F[i,j-1], ...

  2. RMQ(ST算法)

    RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列a,回答若干询问RMQ(A,i,j)(i, j<=n),返回数列a中下标在i ...

  3. RMQ之ST算法模板

    #include<stdio.h> #include<string.h> #include<iostream> using namespace std; ; ],M ...

  4. RMQ问题+ST算法

    一.相关定义 RMQ问题 求给定区间的最值: 一般题目给定许多询问区间. 常见问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间的最小/大 ...

  5. RMQ问题——ST算法

    比赛当中,常会出现RMQ问题,即求区间最大(小)值.我们该怎样解决呢? 主要方法有线段树.ST.树状数组.splay. 例题 题目描述 2008年9月25日21点10分,酒泉卫星发射中心指控大厅里,随 ...

  6. [总结]RMQ问题&ST算法

    目录 一.ST算法 二.ST算法の具体实现 1. 初始化 2. 求出ST表 3. 询问 三.例题 例1:P3865 [模板]ST表 例2:P2880 [USACO07JAN]平衡的阵容Balanced ...

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

    /* RMQ(Range Minimum/Maximum Query)问题: RMQ问题是求给定区间中的最值问题.当然,最简单的算法是O(n)的,但是对于查询次数很多(设置多大100万次),O(n)的 ...

  8. RMQ 问题 ST 算法(模板)

    解决区间查询最大值最小值的问题 用 $O(N * logN)$ 的复杂度预处理 查询的时候只要 $O(1)$ 的时间  这个算法是 real 小清新了   有一个长度为 N 的数组进行 M 次查询 可 ...

  9. Round #4 RMQ问题ST算法

    前几天群里看到有人问[JSOI2008]最大数,一道很简单的问题,线段树无脑做,但是看到了动态ST,emmm,学学吧,听大佬说了下思路,还好,不难的: 四道题都可以用其他数据结构或做法代替,例如线段树 ...

随机推荐

  1. [2017BUAA软工助教]第0次作业小结

    BUAA软工第0次作业小结 零.题目 作业链接: This is a hyperlink 一.评分规则 本次作业满分10分: 按时提交有分 一周内补交得0分 超过一周不交或抄袭倒扣全部分数 评分规则如 ...

  2. Jenkins deploy war to tomcat over https

    ssl - HTTPS login with Spring Security redirects to HTTP - Stack Overflow https://stackoverflow.com/ ...

  3. 前端三大框架Angular & React & Vue

    前端三大框架: Angular[Google]:一套框架,多种平台移动端 & 桌面端.学会用Angular构建应用,然后把这些代码和能力复用在多种多种不同平台的应用上 —— Web.移动 We ...

  4. Pseudo Registers

    Pseudoregister Description @ERR Last error value; the same value returned by the GetLastError() API ...

  5. 日志分析工具之goAccess

    在此推荐一款分析日志的工具,方便我们日常对于网站的访问状况有一个较为清晰的了解  一.安装 官网: https://goaccess.io/download 源码安装: 1. wget http:// ...

  6. Service Account和RBAC授权

    一.介绍 Service Account概念的引入是基于这样的使用场景:运行在pod里的进程需要调用Kubernetes API以及非Kubernetes API的其它服务.Service Accou ...

  7. .NET提供了三种后台输出js的方式:

    .NET提供了三种后台输出js的方式: 首先创建 js文件testjs.js {    Page.ClientScript.RegisterClientScriptInclude("keys ...

  8. 【python练习题】程序9

    #题目:暂停一秒输出. import time for i in range(5): print (i) time.sleep(1)

  9. CABAC总结与补充讨论

    在之前的一篇文章CABAC中我们已经对算法中的大部分细节部分做了详细分析,这里做一个总结与拾遗. 总结 CABAC的编码可以分为以下四个部分: 上下文变量的初始化 待编码语法元素二值化 上下文建模(确 ...

  10. 洛谷P1916 小书童——蚂蚁大战

    题目背景 小A在你的帮助下,开始“刷题”,他在小书童里发现了一款叫“蚂蚁大战”(又称蛋糕保卫战)的游戏.(你懂得) 题目描述 游戏中会出现n只蚂蚁,分别有a1,a2……an的血量,它们要吃你的蛋糕.当 ...