第九章 高级数据结构
1、二维单调队列
2、树状数组
3、带权并查集
4、st表
📖区间最值查询问题



⭐️ST表的实现



📖例题:RMQ最值查询



📚
java
import java.util.*;
public class Main {
final static int N = 100005;
final static int M = (int)(Math.log(N) / Math.log(2) + 1);
static int n,m;
static int[] a = new int[N];
static int[][] f = new int[N][M];
static int[] log2 = new int[N];
// ST表 预处理
static void init(){
// 优化:log2的处理
log2[1] = 0;
for (int i = 2; i < N; i++) {
log2[i] = log2[i>>1] + 1;
}
for (int j = 0; j < M; j++) { // 指数
for (int i = 1; i + (1 << j) - 1 <= n; i++) {
if(j == 0){ // 自己本身
f[i][j] = a[i];
}else{
f[i][j] = Math.max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
}
}
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
for (int i = 1; i <= n; i++) {
a[i] = sc.nextInt();
}
m = sc.nextInt();
init();
// ST表 查询
while (m --> 0) {
int l = sc.nextInt();
int r = sc.nextInt();
int ans = query(l,r);
System.out.println(ans);
}
}
static int query(int l,int r){
int len = r - l + 1;
int k = log2[len];
return Math.max(f[l][k],f[r-(1<<k)+1][k]);
}
}