模板: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;