离线RAQ时,预处理为O(n*lgn),查询为O(1)的算法,比较有意思的一种算法

放个模板在这可以随时看

  1. //ST表(离线)
  2. //预处理 O(n*lgn) , 查询 O(1)
  3. #include <iostream>
  4. #include <stdio.h>
  5. using namespace std;
  6. #define MX 10005
  7.  
  8. int n;
  9. int a[MX];
  10. int st[MX][]; // st[i][j] 是第 i 个数为左端点长为 2^j 区间的最大值
  11. int lgn[MX]; //lgn[i] 是 lgn(i) 的值
  12.  
  13. void Init()
  14. {
  15. lgn[]=-;
  16. for (int i=;i<=n;i++)
  17. {
  18. if ((i&(i-))==) lgn[i]=lgn[i-]+;
  19. else lgn[i]=lgn[i-];
  20. st[i][]=a[i];
  21. }
  22. for (int i=;i<=lgn[n];i++) //区间长为 2^i 次方
  23. for (int j=;j+(<<i)-<=n;j++)
  24. st[j][i]=max(st[j][i-],st[j+(<<(i-))][i-]);
  25. }
  26.  
  27. int inquery(int a,int b)
  28. {
  29. int k = lgn[b-a+];
  30. return max(st[a][k],st[b-(<<k)+][k]);
  31. }
  32.  
  33. int main()
  34. {
  35. scanf("%d",&n);
  36. for (int i=;i<=n;i++)
  37. scanf("%d",&a[i]);
  38. Init();
  39. int m;
  40. scanf("%d",&m);
  41. while (m--)
  42. {
  43. int l,r;
  44. scanf("%d%d",&l,&r);
  45. printf("%d\n",inquery(l,r));
  46. }
  47. return ;
  48. }

ST表(离线RMQ)的更多相关文章

  1. POJ 3264 Balanced Lineup 【ST表 静态RMQ】

    传送门:http://poj.org/problem?id=3264 Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total S ...

  2. ST表解决RMQ问题

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

  3. ST表 求 RMQ(区间最值)

    RMQ即Range Minimum/Maximun Query,中文意思:查询一个区间的最小值/最大值 比如有这样一个数组:A{3 2 4 5 6 8 1 2 9 7},然后问你若干问题: 数组A下标 ...

  4. ST函数(ST表)RMQ O(1)查询 离线

    ST算法是基于倍增的动态规划算法. #include<iostream> #include<cstdio> #include<cstdlib> #include&l ...

  5. 基于ST表的RMQ

    RMQ算法,是一个快速求区间最值的离线算法,预处理时间复杂度O(n*log(n))查询O(1),所以是一个很快速的算法,当然这个问题用线段树同样能够解决. 问题:给出n个数ai,让你快速查询某个区间的 ...

  6. st表、RMQ和LCA

    int lca(int x,int y) { if(de[x]<de[y]) swap(x,y); int d=de[x]-de[y]; for(int i=log2(d);i>=0;i- ...

  7. BZOJ3230 相似子串[后缀数组+二分+st表]

    BZOJ3230 相似子串 给一个串,查询排名i和j的子串longest common suffix和longest common prefix 思路其实还是蛮好想的,就是码起来有点恶心.可以发现后缀 ...

  8. luogu 3865 【模板】ST表

    我太菜了 今天才学会现场脑补ST表静态RMQ #include<iostream> #include<cstdio> #include<algorithm> #in ...

  9. HDU 2586 How far away ?(经典)(RMQ + 在线ST+ Tarjan离线) 【LCA】

    <题目链接> 题目大意:给你一棵带有边权的树,然后进行q次查询,每次查询输出指定两个节点之间的距离. 解题分析:本题有多重解决方法,首先,可用最短路轻易求解.若只用LCA解决本题,也有三种 ...

随机推荐

  1. 微信小程序 - 多地点标识(map)

    演示如下: wxml <map id="map" scale="{{scale}}" controls="{{controls}}" ...

  2. .sh文件怎么安装?

    实例:sh java_1.8.0.sh示例:sh filename.sh

  3. vue 表单验证实例

    1.注册 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  4. selenium从入门到应用 - 8,selenium+testNG实现多线程的并发测试

    本系列所有代码 https://github.com/zhangting85/simpleWebtest本文将介绍一个Java+TestNG+Maven+Selenium的web自动化测试脚本环境下s ...

  5. 【MyBatis学习08】高级映射之一对一查询

    从这一篇博文开始,将总结一下mybatis中的几个高级映射,即一对一.一对多.多对多查询,这篇先总结一下mybatis中的一对一查询.  为了模拟这些需求,事先要建立几个表,不同的表之间将对应上面提到 ...

  6. vue 父组件如何调用子组件的函数Methods

    答案就是使用ref即可. <countdown ref="countdown"></countdown> beforeDestroy () { // 切换页 ...

  7. Java 8里 Stream和parallelStream的区别

    Java中Stream和parallelStream,前者是单管,后者是多管,运行时间上做一个小对比,直接上代码: /** * * @author zhangy6 * <p>对比Strea ...

  8. Atitit.linq java的原理与实现 解释器模式

    Atitit.linq java的原理与实现 解释器模式 1. Linq  from  where 的实现1 2. Where expr 的实现1 3. Attilax的一点变化2 4. 解释器模式的 ...

  9. PHP excel读取excel文件转换为数组

    /*备注:先去下载PHP EXCEL——http://download-codeplex.sec.s-msft.com/Download/Release?ProjectName=phpexcel&am ...

  10. eclipse 断点类别

    行断点 行断点位于一般方法内,双击代码行左边就可以设置行断点: 行断点可以设置条件,右键断点-properties: 1设置效果是第几次到达时暂停,图中所示是当第三次到达时暂停 2是开启条件断点 3是 ...