RMQ算法

来源:互联网 发布:js刷新页面 编辑:程序博客网 时间:2024/06/03 14:32
#define N 50005int maxn[N][32];//maxn[i][j]:记录区间[i,(i+(1<<j)-1)]的最值int a[N];void ST(int n)//预处理,复杂度nlog(n){for(int i=1;i<=n;i++)maxn[i][0]=a[i];int k=log(n)/log(2);//k=log(n)/log(m)=>m^k=nfor(int j=1;j<=k;j++)for(int i=1;i<n;i++)if(i+(1<<j)-1<=n)maxn[i][j]=max(maxn[i][j-1],maxn[i+(1<<(j-1))][j-1]);//递推式else break;}int getMax(int a,int b)//查询,O(1){int k=log(b-a+1)/log(2);return max(maxn[a][k],maxn[b-(1<<k)+1][k]);}