ST表

ST表的功能很简单

它是解决RMQ问题(区间最值问题)的一种强有力的工具

它可以做到O(nlogn)预处理,O(1)查询最值

是一种处理静态区间可重复计算问题的数据结构,一般也就求求最大最小值辣。

ST表的思想是先求出每个[i, i + 2^k)的最值。

注意到这样区间的总数是O(N log N)的.

预处理

不妨令fi,j为[i, i + 2^j)的最小值。

那么首先fi,0的值都是它本身。

而fi,j = min(fi,j−1, fi+2^j−1,j−1)

这样在O(N log N)的时间内就处理好了整个ST表

询问

比如我们要询问[l, r]这个区间的最小值.

找到最大的k满足2^k ≤ r − l + 1.

取[l, l + 2^k), [r − 2^k + 1, r + 1)这两个区间。

注意到这两个区间完全覆盖了[l, r],所以这两个区间最小值

较小的一个就是[l, r]的最小值。

注意到每次询问只要找区间就行了,所以复杂度是O(1).

解释一下数组含义:

ST[j][i]为从j开始的长度为2^i的区间的最大值

Log[x]为比x小的最大的2^y 的y值(或者说是log x 下去整)

代码:

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstdlib>
  4. #include<iomanip>
  5. #include<cmath>
  6. #include<cstring>
  7. #include<string>
  8. #include<algorithm>
  9. #include<time.h>
  10. #include<queue>
  11. using namespace std;
  12. typedef long long ll;
  13. typedef long double ld;
  14. typedef pair<int,int> pr;
  15. const double pi=acos(-);
  16. #define rep(i,a,n) for(int i=a;i<=n;i++)
  17. #define per(i,n,a) for(int i=n;i>=a;i--)
  18. #define Rep(i,u) for(int i=head[u];i;i=Next[i])
  19. #define clr(a) memset(a,0,sizeof a)
  20. #define pb push_back
  21. #define mp make_pair
  22. #define fi first
  23. #define sc second
  24. ld eps=1e-;
  25. ll pp=;
  26. ll mo(ll a,ll pp){if(a>= && a<pp)return a;a%=pp;if(a<)a+=pp;return a;}
  27. ll powmod(ll a,ll b,ll pp){ll ans=;for(;b;b>>=,a=mo(a*a,pp))if(b&)ans=mo(ans*a,pp);return ans;}
  28. ll read(){
  29. ll ans=;
  30. char last=' ',ch=getchar();
  31. while(ch<'' || ch>'')last=ch,ch=getchar();
  32. while(ch>='' && ch<='')ans=ans*+ch-'',ch=getchar();
  33. if(last=='-')ans=-ans;
  34. return ans;
  35. }
  36. //head
  37.  
  38. int m,n,a[],st[][],Log[];
  39.  
  40. int find(int a,int b)
  41. {
  42. int t=Log[b-a+];
  43. return max(st[a][t],st[b-(<<t)+][t]);
  44. //注意到对于[l,r],[l,l+2^x-1],[r-2^x+1,r]并起来是[l,r]
  45. }
  46.  
  47. int main()
  48. {
  49. n=read(),m=read();
  50. rep(i,,n) a[i]=read();
  51. rep(i,,n) st[i][]=a[i];
  52. rep(i,,)
  53. {
  54. for(int j=;j+(<<i)-<=n;j++)
  55. {
  56. st[j][i]=max(st[j][i-],st[j+(<<(i-))][i-]);
  57. //ST[j][i]为从j开始的长度为2^i的区间的最大值
  58. //显然[j,j+2^i)=[j,j+2^(i-1))+[j+2^(i-1),j+2^i)=max(ST[i-1][j],ST[i-1][j+2^(i-1)])
  59. }
  60. }
  61. for(int i=;(<<i)<;i++) Log[<<i]=i;
  62. for(int i=;i<;i++)
  63. {
  64. if(Log[i]==) Log[i]=Log[i-];
  65. //令Log[x]为比x小的最大的2^y
  66. }
  67. for(int i=;i<=m;i++)
  68. {
  69. int x,y;
  70. x=read(),y=read();
  71. printf("%d\n",find(x,y));
  72. }
  73. return ;
  74. }

洛谷 P3865 ST表的更多相关文章

  1. 洛谷P3865 ST表

    传送门啦 思路: $ f[i][j] $ 表示从 $ i $ 开始,包含 $ 1<<j $ 个元素的区间的区间最大值: 转移方程: $ f[i][j]=max_(f[i][j-1],f[i ...

  2. 洛谷—— P3865 【模板】ST表

    https://www.luogu.org/problemnew/show/P3865 题目背景 这是一道ST表经典题——静态区间最大值 请注意最大数据时限只有0.8s,数据强度不低,请务必保证你的每 ...

  3. 洛谷 P3865 【模板】ST表

    P3865 [模板]ST表 题目背景 这是一道ST表经典题——静态区间最大值 请注意最大数据时限只有0.8s,数据强度不低,请务必保证你的每次查询复杂度为 O(1)O(1) 题目描述 给定一个长度为  ...

  4. [洛谷P3865]【模板】ST表

    题目大意:区间静态最大值 题解:ST表,zkw线段树 ST表: st[i][j]存[i,i+$j^{2}$-1]的最大值,查询时把区间分成两个长度相同的小区间(可重复) #include<cst ...

  5. skkyk:题解 洛谷P3865 【【模板】ST表】

    我不会ST表 智推推到这个题 发现标签中居然有线段树..? 于是贸然来了一发线段树 众所周知,线段树的查询是log(n)的 题目中"请注意最大数据时限只有0.8s,数据强度不低,请务必保证你 ...

  6. 洛谷 P3865 【模板】ST表(模板)

    嗯... 题目链接:https://www.luogu.com.cn/problem/P3865 ST(Sparse Table)算法,运用了倍增的思想. 我们令f[i][k]数组表示区间[i, i ...

  7. [NOIP1999] 提高组 洛谷P1014 Cantor表

    题目描述 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的.他是用下面这一张表来证明这一命题的: 1/1 1/2 1/3 1/4 1/5 … 2/1 2/2 2/3 2/4 … ...

  8. 洛谷 P1014 Cantor表 Label:续命模拟QAQ

    题目描述 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的.他是用下面这一张表来证明这一命题的: 1/1 1/2 1/3 1/4 1/5 … 2/1 2/2 2/3 2/4 … ...

  9. (模拟) codeVs1083 && 洛谷P1014 Cantor表

    题目描述 Description 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的.他是用下面这一张表来证明这一命题的: 1/1 1/2 1/3 1/4 1/5 … 2/1 2/ ...

随机推荐

  1. springcloud-概念

    springcloud-概念 一.架构演进过程 单体架构----分布式架构----SOA(eg.dubbo)服务治理架构----微服务 随着互联网的发展,需求的激增致使网站应用规模的扩大,最后转成了技 ...

  2. the server responsed width a status of 404 (Not Found)

    最近使用VS code写代码,使用Beautify插件格式化代码后,报以下错误: 反复查看代码,初始感觉没什么问题,有点懵.. 随着时间的推移,后来果然发现问题所在: 在加载模块的地方,多出了个空格( ...

  3. Git命令的总结

    Git 是当前最流行的版本控制程序之一,文本包含了 Git 的一些基本用法 创建 git 仓库 初始化 git 仓库 mkdir project  # 创建项目目录cd project  # 进入到项 ...

  4. EC元素

    '''判断title是否是一致,返回布尔值'''WebDriverWait(driver,10,0.1).until(EC.title_is("title_text")) '''判 ...

  5. redis数据库如何用Django框架缓存数据

    ---恢复内容开始--- 一.python 使用redis 1.1 安装 pip install redis 测试有一些基本的数据类型 import redis # redis 是一个缓存数据库 # ...

  6. Windows PyCharm QtDesigner/pyuic5配置

    QtDesigner 配置成功截图如下: C:\ProgramData\Anaconda3\Library\bin\designer.exe $FileDir$ pyuic5 配置成功截图如下: C: ...

  7. (转) IntelliJ IDEA2018激活

    IntelliJ IDEA2018破解教程 破解方法:下载破解补丁→修改配置文件→输入激活码→激活成功 由于JetBrains封杀,大部分激活服务器已经不能使用,使用下面的比较麻烦的方法也可以进行破解 ...

  8. tomcat CATALINA_HOME与CATALINA_BASE的区别

    区别 https://blog.csdn.net/cfydaniel/article/details/41351927 Tomcat启动分析(我们为什么要配置CATALINA_HOME环境变量) ht ...

  9. 常用命令之------tcpdump

    语法: tcpdump [options] [not] proto dir type 案例 tcpdump -i eth0 host 192.168.1.1 and icmp -n -w /tmp/t ...

  10. element-ui + redis + mongo + nuxt

    用户注册: let {username,password} = req.body; let u = await UserModel.findOne({username}); if(u){ res.js ...