模板:ST表

ST表:解决RMQ类问题,预处理$O(nlog_{2}n)$,查询$O(1)$

较线段树来说每次查询为1,线段树为log,但ST表不方便更改

ST表还用了倍增思想。

模板:

struct ST_MAP{
	int log[MAXN],val[MAXN],st_max[35][MAXN],st_min[35][MAXN];
	inline void build(){
		log[1]=0,st_min[0][1]=st_max[0][1]=val[1];
		for(int i=2;i<=n;++i){
		    log[i]=log[i-1];
		    if(i==1<<log[i-1]+1) ++log[i];
		    st_min[0][i]=st_max[0][i]=val[i];
		}
		for(int i=1;i<=30;++i){
			for(int j=1;j<=n;++j){
				if(j+(1<<(i-1))>n) break;
				st_max[i][j]=max(st_max[i-1][j],st_max[i-1][j+(1<<(i-1))]);
				st_min[i][j]=min(st_min[i-1][j],st_min[i-1][j+(1<<(i-1))]);
			}
		}
	}
	inline int query_max(int l,int r){
		int k=log[r-l+1];
		return max(st_max[k][l],st_max[k][r-(1<<k)+1]);
	}
	inline int query_min(int l,int r){
		re int k=log[r-l+1];
		return min(st_min[k][l],st_min[k][r-(1<<k)+1]);
	}
}ST;

 

posted @ 2019-08-06 11:46  xukl21  阅读(150)  评论(0编辑  收藏  举报