首页 > 代码库 > RMQ
RMQ
也是一大神器,起码以后不用敲线段树的求区间的线段树了。
代码30行左右 ,效率肯定比线段书快不少
还有为以后写在线的LCA算法做个铺垫。
思路比较简单,这里引荐不少优秀的博文。
http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=lowestCommonAncestor#Range_Minimum_Query_%28RMQ%29
topcoder也有不少介绍算法的优秀博文
http://dongxicheng.org/structure/lca-rmq/
还有这个博客
然后是模板: 1 #include<iostream>
2 #include<stdio.h>
3 #include<string.h>
4 #include<cmath>
5 #include<algorithm>
6 #include<string>
7 #include<vector>
8 using namespace std;
9 #define N 51111
10 int n,m;
11 int a[N];
12 int dp[N][20];
13
14 void RMQ()
15 {
16 // int tmp=log((double)n)/log(2.0);
17 for (int i=1;i<=n;i++)
18 dp[i][0]=a[i];
19 for (int j=1;j<=log(n)/log(2);j++)
20 for (int i=1;i<=n;i++)
21 if (i+(1<<j)-1<=n)
22 dp[i][j]=min(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
23 }
24
25 int Min(int l,int r)
26 {
27 int k=log(r-l+1)/log(2.0);
28 return min(dp[l][k],dp[r-(1<<k)+1][k]);
29 }
30
31 int main()
32 {
33 scanf("%d%d",&n,&m);
34 for (int i=1;i<=n;i++)
35 scanf("%d",&a[i]);
36 RMQ();
37 while (m--)
38 {
39 int x,y;
40 scanf("%d%d",&x,&y);
41 printf("%d\n",Min(x,y));
42 }
43 return 0;
44 }
3 #include<string.h>
4 #include<cmath>
5 #include<algorithm>
6 #include<string>
7 #include<vector>
8 using namespace std;
9 #define N 51111
10 int n,m;
11 int a[N];
12 int dp[N][20];
13
14 void RMQ()
15 {
16 // int tmp=log((double)n)/log(2.0);
17 for (int i=1;i<=n;i++)
18 dp[i][0]=a[i];
19 for (int j=1;j<=log(n)/log(2);j++)
20 for (int i=1;i<=n;i++)
21 if (i+(1<<j)-1<=n)
22 dp[i][j]=min(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
23 }
24
25 int Min(int l,int r)
26 {
27 int k=log(r-l+1)/log(2.0);
28 return min(dp[l][k],dp[r-(1<<k)+1][k]);
29 }
30
31 int main()
32 {
33 scanf("%d%d",&n,&m);
34 for (int i=1;i<=n;i++)
35 scanf("%d",&a[i]);
36 RMQ();
37 while (m--)
38 {
39 int x,y;
40 scanf("%d%d",&x,&y);
41 printf("%d\n",Min(x,y));
42 }
43 return 0;
44 }
RMQ
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。