@zhangche0526
2017-02-25T06:28:47.000000Z
字数 509
阅读 817
思路f[i][k]表示一个从i起始、长度为的区间中的最值
易得一个状态转移方程:
int f[MAXN + 1][MAXM + 1];int a[MAXN + 1];int n;void Init(){for(int i = 1; i <= n; i ++)f[i][0] = a[i];for(int k = 1; (1 << k) <= n; k ++)for(int i = 1; i + (1 << k) - 1 <= n; i ++)f[i][k] = max(f[i][k - 1], f[i + (1 << (k - 1))][k - 1]);}int RMQ(int l, int r){int k = 0;while( (1 << (k + 1)) <= r - l + 1 ) k ++;return max( f[l][k], f[r + 1 - (1 << k)][k] );}