RMQ

用倍增 快速求解区间最值 (GCD LCM 区间与或)

先预处理以每个点为起点的log个区间的最值

具体来说 f[i][j] 表示 [i, i + 2 ^ j]区间的最值

显然有转移 f[i][j] = max(f[i][j - 1], f[i + (1<<(j-1))][j-1]) 像区间dp一样先枚举长度j

对于查询[l, r]

考虑令k为满足 l+2^k <= r 的最大的一个k

k = log_2(r-l+1) 可以预处理出来每个长度的k f[i] = f[i>>1] + 1;

考虑这个k有什么性质? 发现 l + 2^(k+1) 必然 > r 所以[l, r]一定可以被两个长度为2^k的区间覆盖

[l, r] = max(f[l][k], f[r - 2^k + 1][k]

posted @ 2025-05-22 09:38  闫柏军  阅读(5)  评论(0)    收藏  举报