虽然早知道st(Sparse Table)算法,今天第一次动手写,事无巨细,姑且记录一下。
朴素的离线做法是进行n*n次的预处理,生成所有(i,j)对的最小值,保存起来,查询只需O(1)。
st做法则是借助二分的做法,进行n*log次预处理,生成所有(i,j)对的最小值,但这里j是对2的幂。
RMQ的st算法和树状数组都在一定场合替代线段树,只是st多占些内存,多些预处理,查询快,是典型的离线算法。
需要注意的是,st预处理时应该对无效的数据不计算,这样在VC下比都计算要快大约一倍(3s+->1.6s)。
这道题在C++下比G++下提交耗时要少得多。