ST表复习
因为线段树套SA求lcp写炸了,于是跑来学ST表
ST表是一种高效的查询静态最值的数据结构,在询问次数多的时候具有优势(O(1)查询)
ST表构成:ONlogN建立,O(1)查询
建表:
-
可以先预处理处log和bin\((1\)<<\(i)\)
log:log值向下取整bin[0]=1;log[1]=0; for(int i=2;i<=22;i++){ //log向下取整 log[i]=log[i>>1]+1; } for(int i=1;i<=22;i++){ bin[i]=bin[i-1]<<1; }
-
类似DP的建表方式:
\(f[i][j]\) 表示 \(i\) ~ \(i+2^{j−1}-1\) 这段区间
\(f(i,j)=max(f(i,j−1),f(i+2^{j−1},j−1))\)
就是把一个区间分为两段
边界条件:\(f[i][0]=a[i]\)for(int j=1;j<=20;j++){ for(int i=1;i+bin[j]-1<=n;i++){ f[i][j]=max(f[i][j-1],f[i+bin[j-1]][j-1]); } }
查询
见图:
int query(int l,int r){
int k=log[r-l+1];
return min(f[l][k],f[j-bin[k]+1][k]);
}