RMQ问题(ST算法)
admin
2023-02-14 14:20:03
0

RMQ是询问某个区间内的最大值或最小值的问题,ST算法可以求解RMQ问题.ST算法通常用在要 多次询问某一些区间的问题中,相比于线段树,它的程序实现更加简单,运行速度更快,它可以做到O(nlogn)的预处理,O(1)回答每个问题.使用ST算法的条件是没有修改操作,因此它适用于没有修改操作并且访问次数较多(10^6级别甚至更大)的情况.

1.预处理

ST算法的原理实际上是动态规划,首先要知道f数组的含义,f[i][j]中i表示左边端点,j表示2^j个长度, 因此f[i,j]表示的是区间为[i,i+2^j-1]这个范围内的最大值,也就是以a[i]为起点连续的2^j个数的最大值.由于元素个数为2^j个,所以从中间平均分成两部分,每一部分的个数都为2^(j-1);假设f[6][3]分为f[6][2]和f[10][2],如下图所示,
RMQ问题(ST算法)
整个区间的最大值一定是左右两部分最大值的较大者,满足动态规划的最优化原理,分析得f数组的状态转移方程为f[i][j]=max(f[i][j-1],f[i+2^(j-1)][j-1]).

for(int j = 1;(1<

2.询问

当要访问区间[L,R]的最大值,需要知道区间的长度len,mn数组存放的是小于等于一定长度len的最大的2的幂次,若要访问区间[5,10]的最大值,则要先计算出men[len]的值,那么区间[5,10]=[5,8]U[7,10].
RMQ问题(ST算法)

代码实现

//对于一定长度的区间len,mn[len]表示小于等于len的最大的2的幂次 
   for(int len = 1;len <= n;++len)
   {
     int k = 0;
     while(1<<(k+1) <= len)
     k++;
     mn[len] = k;
   }

3.求区间[x,y]最大值

int k = mn[R - L + 1];
ans = max(f[L][k],f[R-(1<

代码实现


#include
using namespace std;
const int maxn=1e6+5; 
int f[maxn][25];
int mn[maxn];
int a[maxn];
int m,n;
void rmq_init()
{
  //初始化所有长度为1的区间的最大值 
  for(int i = 1;i <= n;i++)    
  f[i][0] = a[i];

  for(int j = 1;(1<>n;
  for(int i = 1;i <= n;i++)
  cin>>a[i];
  rmq_init();
  int L,R;
  cin>>m;
  for(int i = 1;i <= m;i++)
  {
    cin>>L>>R;
    cout<

结果截图
RMQ问题(ST算法)

相关内容

热门资讯

“强卖”委内瑞拉石油,美国得失... 【环球时报报道 记者 倪浩】当地时间1月14日,一位美国政府官员透露,美国已完成首批委内瑞拉石油的销...
格力电器,大手笔分红近56亿 【大河财立方消息】1月15日晚间,格力电器发布2025年中期权益分派实施公告。格力电器将以公司现有总...
河南省政协十三届常委会第十七次... 1月15日,省政协十三届常委会第十七次会议在郑州闭幕。会议通过有关人事事项。中国人民政治协商会议第十...
习近平:在中央城市工作会议上的... 在中央城市工作会议上的讲话(2025年7月14日)习近平时隔10年,党中央再次召开城市工作会议,主要...
星动纪元与顺丰科技签约,推动具... 来源:市场资讯 (来源:IT之家) IT之家 1 月 15 日消息,今日,星动纪元与顺丰科技正式签约...
委反对派领袖:我已将诺奖献给了... 委内瑞拉变天后,美国总统特朗普并未像外界预期的那样支持该国反对派,而是支持了该国副总统罗德里格斯。委...
芬兰、荷兰表示将向格陵兰岛派遣... 格陵兰岛自治政府总理重申格陵兰岛不会属于美国当地时间1月15日,格陵兰岛自治政府总理延斯-弗雷德里克...
智谱华章申请数字人口型驱动方法... 国家知识产权局信息显示,成都智谱华章科技有限公司申请一项名为“数字人口型驱动方法、装置及电子设备”的...
“考砸”的学生,赚了 2020年,在一所二本院校执教的教师黄灯,出版了热议一时的非虚构作品《我的二本学生》。她以15年的执...
图灵智算量子申请端面耦合器专利... 国家知识产权局信息显示,上海图灵智算量子科技有限公司申请一项名为“一种端面耦合器、光芯片和光量子计算...