RMQST表实现/单调队列

写了几道题之后才敢来瞎bb

RMQ (Range Minimum/Maximum Query)问题是指:

对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,RMQ问题是指求区间最值的问题。

for循环遍历一边,然后输出,那么你很容易想到会被T飞掉;

1、先写一种比较高效的ST算法解决这个问题。

ST(Sparse Table)算法可以在O(nlogn)时间内进行预处理,然后在O(1)时间内回答每个查询。

其实ST表是一种动态规划的思想;每次运用倍增求解每一个区间;

定义:f(i,j)表示[i,i+2j1]这段长度为2j的区间中的最大值。

预处理:f(i,0)=ai。即[i,i][i,i]区间的最大值就是ai

状态转移:将[i,j]平均分成两段,一段为[i,i+2j11],另一段为[i+2j1,i+2j1]

两段的长度均为2j1f(i,j)的最大值即这两段的最大值中的最大值。

得到f(i,j)=max{f(i,j1),f(i+2j1,j1)};

查询:

摘来大佬的题解;

猜你喜欢

转载自www.cnblogs.com/Tyouchie/p/10706243.html
今日推荐