码迷,mamicode.com
首页 > 编程语言 > 详细

自己写的 RMQ ST算法模板类

时间:2018-01-22 11:59:25      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:st算法   数据   int   模板类   gpo   bsp   建立   public   sed   

技术分享图片
 1 #include<iostream>
 2 using namespace std;
 3 #include<cstdio>
 4 #include<cstring>
 5 /*
 6  说明:
 7  RMQ<T> rr;定义一个查询区间最小值的数据类型为T 的类
 8  SetMaxn(T maxn);设置初始化数组的最大值
 9  Creat(T a[],int maxn) 设置查询的数组,和数组长度,从0开始
10  Getx(int la,int lb) 查询数组中下标为 la - lb 的区间的最小值
11  Getw(int la,int lb) 查询数组中位置为 la - lb 的区间最小值
12  自定义类型需要重载 < 
13 */
14 template<class T>
15 class RMQ{
16     public:
17      T* a;
18      int t;
19      T **mn;
20      T maxn;
21      int *log2;
22      void SetMaxn(T *maxn){
23         this->maxn=*maxn;
24      }
25      void SetMaxn(T maxn){
26         this->maxn=maxn;
27      }
28      void Creat(T a[],int maxn){//建立一个最大为maxn的RMQ处理类 
29           int k=1,p=0;
30           log2=new int[maxn+1];
31           for(int i=0;i<=maxn;i++)
32               log2[i]=(i==0?-1:log2[i>>1]+1);
33           while(k<maxn){
34              k*=2;
35             p+=1;
36         }
37         mn=new T*[maxn+1];
38         for(int i=0;i<maxn;i++){
39             mn[i] = new T[t+1];
40             mn[i][0]=a[i];
41             for(int j=1;j<=t;j++)
42                 mn[i][j]=maxn;
43         }
44         t=p;
45          for(int j=1;j<=t;j++)
46              for(int i=0;i+(1<<j) <= maxn;i++){
47                      T sa=mn[i][j-1];
48                     T sb=mn[i+(1<<(j-1))][j-1];
49                      if(sa<sb)
50                          mn[i][j]=sa;
51                      else
52                          mn[i][j]=sb;
53              }    
54      }
55     T Getx(int ql,int qr){
56             int k=log2[qr-ql+1];
57             return min(mn[ql][k],mn[qr-(1<<k)+1][k]);
58     }
59     T Getw(int ql,int qr){
60             ql--,qr--;
61             int k=log2[qr-ql+1];
62             return min(mn[ql][k],mn[qr-(1<<k)+1][k]);
63     }
64 } ;
65 RMQ<int> rr;
66 int a[]={1,3,4,5,6,7,2,4,5,6,7,8};
67 int main(){
68     rr.SetMaxn(0x7f7f7f7f);
69     rr.Creat(a,12);
70     while(1){
71         int a,b;
72         scanf("%d%d",&a,&b);
73         cout<<rr.Getw(a,b)<<endl;
74     }
75 }
View Code

 

自己写的 RMQ ST算法模板类

标签:st算法   数据   int   模板类   gpo   bsp   建立   public   sed   

原文地址:https://www.cnblogs.com/xfww/p/8328198.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!