对于典型的RMQ问题,写线段树太麻烦,于是我们想到了一个优秀的算法。。
ST表预处理O(nlogn),单次查询O(1),q次查询O(q),当n too large时,且是RMQ问题时,可以选择写ST表。。
主程序预处理:
for (i=1;i<=n;i++)
f[i][0]=a[i];
m=log(n)/log(2);
for (i=1;i<=m;i++)
for (j=n;j>=1;j--)
{
f[j][i]=f[j][i-1];
if (j+(1<<(i-1))<=n)
f[j][i]=max(f[j][i],f[j+(1<<(i-1))][i-1]);//求最小值时max->min
}
模板:
int rmq(int l,int r)
{
m=log(r-l+1)/log(2);
return max(f[l][m],f[r-(1<<m)+1][m]);//同上
}