啊谈不上学习了。复习一下原理留一下板子。
$fleft[i,j ight]$表示以$i$为起点,区间长度为${2}^{j}$的区间最值。以最小值为例,即
$minleft(aleft [ k ight ] | ileq kleq i+2^{j}-1 ight)$
递推式就是倍增思想,为均分的两段区间的最值。即
$minleft(fleft[i,j-1 ight],fleft[i+2^{j-1},j-1 ight ] ight)$
预处理复杂度$Oleft(nlog_{2}n ight )$
如果询问$L$到$R$区间的最值,它等于两段覆盖它的区间的$min$,即
$minleft(fleft[l,k ight],fleft[r-2^{k}+1,k ight] ight),k=log_{2}left(R-L+1 ight)$
求解的时候是$Oleft(1 ight )$回答的。
我用了全篇$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]); }