- 2022tysc1451 的博客
RMQ
- 2025-3-23 15:01:57 @
RMQ(Range Minimum Query 区间最小值问题)
ST(Sparse_Table)算法
令f[i][j]表示从i开始的,长度为2^j的一段元素中的最小值
f[i][j]=min(f[i][j-1],f[i+2^(j-1)][j-1])
时间复杂度:O(nlogn)
令k为满足2^k<=r-l+1的最大整数,以l为头,r为尾两个长度为2^k的区间合起来即覆盖了[l,r]的区间
min(f[l][k],f[r-2^k+1][k])
ST表:
void ST(){
for(int j=1;j<=log[n];j++){
for(int i=1;i+(1<<j)-1<=n;i++){
f[i][j]=min/max(f[i][j-1],f[i+(1<<j-1)][j-1]);
}
}
}
查询:
int answer(int l,int r){
int k=a[r-l+1];
return min(f[l][k],f[r-(1<<k)+1][k]);
}