问题 数列中下标在l ~ r之间的数最大(小)值是多少 时间复杂度 O( 1 ) 状态表示 f[i][j]表示从 i 开始的 2^j 个数的最大值 状态转移方程 f[i][j] = max( f[i][j - 1], f[i + 2 ^ (j - 1)][j - 1] ) 初值 f[1 ~ n][0] = a[1 ~ n] 目标 max / min code void pre() { for( int i = 1; i <= n; i ++ ) f[i][0] = a[i]; int t = log2( n ); for( int j = 1; j <= t; j ++ ) for( int i = 1; i - 1 + ( 1 << j ) <= n; i ++ ) f[i][j] = max( f[i][j - 1], f[i + ( 1 << j - 1 )][j - 1] ); } int ask( int l, int r ) { int k = log2( r - l + 1 ); return max( f[l][k], f[r - ( 1 << k ) + 1][k] ); }