ST表
在\(O(30*n)\)的复杂度内建ST表
int n; cin>>n; for(int i=1;i<=n;++i) cin>>a[i]; for(int i=1;i<=n;++i) st[i][0]=a[i]; for(int j=1;j<=30;++j) for(int i=1;i<=n;++i) if(i+(1<<(j-1))<=n) st[i][j]=max(st[i][j-1],st[i+(1<<(j-1))][j-1]);
查询复杂度为\(O(log(n))\)
int query(int l,int r){ int len=log2(r-l+1); return max(st[l][len],st[r-(1<<len)+1][len]); }
模板求的是区间最大值,如果需要求最小值,只需要把max()
改为min()
即可。
来源:https://www.cnblogs.com/CADCADCAD/p/12284599.html