首页 > 代码库 > RMQ算法模板
RMQ算法模板
分别写了下标从0和1开始的两种
1 #include<stdio.h>
2 #include<string.h>
3 #include<algorithm>
4 #include<math.h>
5 using namespace std;
6
7 const int maxn=1e5+5;
8 const int maxl=20;
9
10 int ma[maxn][maxl];
11 int st[maxn][maxl];
12 int a[maxn],prelog[maxn];
13
14 void initRMQ(int n){
15 for(int i=2;i<=n;++i){
16 prelog[i]=prelog[i-1];
17 if((i&(-i))==i)prelog[i]++;
18 }
19 for(int i=1;i<=n;++i)ma[i][0]=a[i];
20 for(int j=1;(1<<j)<=n;++j){
21 for(int i=1;i+(1<<j)-1<=n;++i){
22 ma[i][j]=max(ma[i][j-1],ma[i+(1<<j-1)][j-1]);
23 }
24 }
25 }
26
27 int askRMQ(int l,int r){
28 if(l>r)swap(l,r);
29 int k=prelog[r-l+1];
30 return max(ma[l][k],ma[r-(1<<k)+1][k]);
31 }
32
33
34 void initST(int n){
35 for(int i=2;i<=n;++i){
36 prelog[i]=prelog[i-1];
37 if((1<<prelog[i]+1)==i)++prelog[i];
38 }
39 for(int i=0;i<n;++i)st[i][0]=a[i];
40 for(int i=n-1;i>=0;--i){
41 for(int j=1;i+(1<<j)-1<n;++j){
42 st[i][j]=max(st[i][j-1],st[i+(1<<j-1)][j-1]);
43 }
44 }
45 }
46
47 int askST(int l,int r){
48 if(l>r)swap(l,r);
49 int k=prelog[r-l+1];
50 return max(st[l][k],st[r-(1<<k)+1][k]);
51 }
RMQ算法模板
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。