[关闭]
@zhangche0526 2017-02-25T06:28:47.000000Z 字数 509 阅读 735

ST求RMQ

思路f[i][k]表示一个从i起始、长度为的区间中的最值
易得一个状态转移方程:


查询[l,r]区间最值:

时间复杂度:

  1. int f[MAXN + 1][MAXM + 1];
  2. int a[MAXN + 1];
  3. int n;
  4. void Init()
  5. {
  6. for(int i = 1; i <= n; i ++)
  7. f[i][0] = a[i];
  8. for(int k = 1; (1 << k) <= n; k ++)
  9. for(int i = 1; i + (1 << k) - 1 <= n; i ++)
  10. f[i][k] = max(f[i][k - 1], f[i + (1 << (k - 1))][k - 1]);
  11. }
  12. int RMQ(int l, int r)
  13. {
  14. int k = 0;
  15. while( (1 << (k + 1)) <= r - l + 1 ) k ++;
  16. return max( f[l][k], f[r + 1 - (1 << k)][k] );
  17. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注