标签:i++ 最大值 class 二维数组 取整 处理 double 二维 影响
st表是一个求RMQ问题的一种比线段树查询时间复杂度要小的算法
st表的主体是一个二维数组st[i][j],表示需要查询的数组的从下标i到下标i+2^j - 1的最值,这里以最大值为例
首先应该预处理log函数 因为向下取整所以可以这么来做:
int mlog[N]; void pre(int n){ mlog[1]=0; mlog[2]=1; for(int i=3;i<=n;i++){ mlog[i]=mlog[i/2]+1; } }
然后就是初始化st表了
const int N=1e3+10; int st[N][20]; void init(int& nums[],int n){ for(int i=0;i<n;i++){ st[i][0]=nums[i]; } for(int j=1;(1<<j)<=n;j++){ for(int i=0;i+(1<<j)-1<n;i++){ st[i][j]=max(st[i+(1<<(j-1))][j-1],st[i][j-1]); } } }
最后就是查询了:
int query(int l,int r) { int k = (int)(log((double)(r-l+1))-log(2.0)); return max(st[l][k],st[r-(1<<k)+1][k]); //为了防止向下取整出现区间不完整的问题,那么就直接把l,r分成两个区间 一个是前半部分包含,一个是后半部分包含 虽然有重叠但是对求最值并没有影响 }
模板先写下,以后发现有错误或优化再改
标签:i++ 最大值 class 二维数组 取整 处理 double 二维 影响
原文地址:https://www.cnblogs.com/kstranger/p/13340866.html