码迷,mamicode.com
首页 > 其他好文 > 详细

RMQ

时间:2018-10-02 22:20:59      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:nim   log   tmp   init   查询   最小值   时间   ret   mini   

范围最小值问题(Range Minimum Query)
常用Tarjan的Sparse-Table算法,预处理时间为\(O(nlogn)\),查询为\(O(1)\)

int rmq[maxn][maxn];
void rmq_init(int a[],int l,int r)
{
  for (int i = 0; (1 << i) <= r-l+1; ++i)
    for (int j = l; j + (1 << i) - 1 <= r; ++j)
      rmq[j][i] = (i == 0) ? a[j] : min(rmq[j][i - 1], rmq[j + (1 << (i - 1))][i - 1]);
}
int rmq_query(int l, int r)
{
  int tmp = 0;
  while ((1 << (tmp + 1)) <= r - l + 1)tmp++;
  return min(rmq[l][tmp], rmq[r - (1<<tmp) + 1][tmp]);
}

RMQ

标签:nim   log   tmp   init   查询   最小值   时间   ret   mini   

原文地址:https://www.cnblogs.com/maoruimas/p/9737733.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!