ST表学习
啊談不上學習了。復習一下原理留一下板子。
$f\left[i,j \right]$表示以$i$為起點,區間長度為${2}^{j}$的區間最值。以最小值為例,即
$min\left(a\left [ k \right ] | i\leq k\leq i+2^{j}-1\right)$
遞推式就是倍增思想,為均分的兩段區間的最值。即
$min\left(f\left[i,j-1\right],f\left[i+2^{j-1},j-1\right ]\right)$
預處理復雜度$O\left(nlog_{2}n\right )$
如果詢問$L$到$R$區間的最值,它等于兩段覆蓋它的區間的$min$,即
$min\left(f\left[l,k\right],f\left[r-2^{k}+1,k\right]\right),k=log_{2}\left(R-L+1\right)$
求解的時候是$O\left(1\right )$回答的。
我用了全篇$LaTeX$公式,好無聊啊。。。。
板子
?
int f[N][20],p[20]; void ST(){p[0]=1;for(int i=1;i<=18;i++)p[i]=p[i-1]<<1;for(int i=1;i<=n;i++)f[i][0]=x[i];for(int j=1;j<=18;j++)for(int i=1;i+(1<<j)-1<=n;i++)f[i][j]=max(f[i][j-1],f[i+p[j-1]][j-1]); }?
轉載于:https://www.cnblogs.com/orzzz/p/7717697.html
總結
- 上一篇: 通用后台模版的实现
- 下一篇: 算法竞赛入门经典_6数据结构基础