『数据结构』RMQ 问题
RMQ (Range Minimum/Maximum Query),即区间最值问题。 对于长度为 相关算法
ST 算法假设当前题目要求区间最小值,我们令 于是便有:
分析可知,
最终(从下往上看):
写一组数据,自己动手模拟一遍就可以理解咯~ 预处理根据状态转移方程,首先指定当区间长度为
void ST_Init(const vector<int> &A)
{
int n=A.size();
for(int i=0; i<n; i++)
dp[i][0]=A[i];
for(int j=1; (1<<j)<=n; j++)
for(int i=0; i+(1<<j)<=n; i++)
dp[i][j]=min(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
}
查询预处理出整个 int RMQ(int L,int R)
{
int k=0;
while((1<<(k+1))<=R-L+1)k++;
return min(dp[L][k],dp[R-(1<<k)+1][k]);
}
线段树嗯!怎么说呢?感觉线段树在这种类型的题目中好像是最万能的方法了。 无论是 当然,除了一维情况下的普通线段树,还有在二维平面中的线段树,类似的也可以实现三维、四维。。。(啊!千千你要做什么o((>ω< ))o) 好啦~ 对于一维中的线段树,我们想要查询某个区间的最值,首先就应该建树咯~(具体方法省略) 而在查询时,我们可以从根节点向下递归搜索,如下图,假设查询区间为 将 我们假设查询还是区间最小值,于是最终的结果为
线段树可以解决普通的 线段树:虽然我代码长,但是我功能强大呀~~~(〃` 3′〃) 千千:万一某天千千找到了更好的解法怎么办呢? 剧透:树链剖分其实是把一棵树剖分成很多链存储在一维空间中(压缩、压缩、压缩),然后最后的解法和一维线段树就变的一样咯。(干嘛说出来呀我~) RMQ 标准算法待定-ing (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |