#define N 50005
int 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=n
for(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]);
}
RMQ算法
最新推荐文章于 2022-10-02 11:38:30 发布