RMQ -- 不修改的权值的求区间最大最小值
2017-07-26 01:09
302 查看
模板题
//介绍的是RMQ - ST 在线算法.
这篇博客讲的好,不懂就去看
//所以RMQ一般也就在LCA中有点应用,其他运用还是不多,主要学的是思路.
//先放一个板子,解释与AC Code 在下面.
AC Code(求最大值就类似呗)
//介绍的是RMQ - ST 在线算法.
这篇博客讲的好,不懂就去看
//所以RMQ一般也就在LCA中有点应用,其他运用还是不多,主要学的是思路.
//先放一个板子,解释与AC Code 在下面.
/** @Cain*/ const int maxn = 1e6+5; int dp[maxn][32]; int n; void RMQ() { for(int j=1;(1<<j)<=n;j++){ for(int i=1;i+(1<<j)-1<=n;i++){ dp[i][j] = min(dp[i][j-1],dp[i+(1<<(j-1))][j-1]); } } } int Find(int l,int r) { int k = log2(r-l+1); return min(dp[l][k],dp[r-(1<<k)+1][k]); } int main() { scanf("%d",&n); // Fill(dp,0); for(int i=1;i<=n;i++){ scanf("%d",&dp[i][0]); } RMQ(); int q; scanf("%d",&q); while(q--){ int l,r; scanf("%d%d",&l,&r); printf("%d\n",Find(l,r)); } }
AC Code(求最大值就类似呗)
/** @Cain*/ const int maxn = 1e6+5; int dp[maxn][32];// dp[i,j]表示 从 i 开始 到i+2j -1(可能不是很 //清楚,是二的 j 次方再减一)这个区间中的最大值 int n; void RMQ() { for(int j=1;(1<<j)<=n;j++){ //如果你问为什么不把j放在内循环的话,说明你还没有理解到RMQ. for(int i=1;i+(1<<j)-1<=n;i++){ dp[i][j] = min(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);//它是竖着弄的,不是平常讲的时候的是横着的.一个意思.行标在变哒! 也 //就是我们理解的那个的列标在变. } } } int Find(int l,int r) //如何去找那两个区间了,从而实现O(1)的时间找出答案. { //并且区间应该满足边界是哦们需要的,另一方是可以用2的几次方来表示的. int k = log2(r-l+1); return min(dp[l][k],dp[r-(1<<k)+1][k]); //求出这样的一个k,我们就可以这样表示我们要求的区间了. } int main() { scanf("%d",&n); // Fill(dp,0); for(int i=1;i<=n;i++){ scanf("%d",&dp[i][0]); } RMQ(); int q; scanf("%d",&q); while(q--){ int l,r; scanf("%d%d",&l,&r); printf("%d\n",Find(l,r)); } }
相关文章推荐
- hdu5289RMQ求区间最大最小值和单调队列维护区间最大最小值
- 【RMQ问题】求数组区间最大值,NYOJ-1185-最大最小值
- RMQ 区间最大值 最小值查询
- poj3264线段树---区间最大最小值查询(RMQ)
- cf#333 (Div. 2) 区间最大最小值(RMQ || STL_set)
- poj 3237 Tree 【LCA转RMQ】 【修改边权 + 修改(a, b)路径边权 + 查询(a, b)路径上最大边权值】
- POJ 3264 ST表(RMQ问题:查询区间最大最小值)
- 【POJ 3264】【RMQ 或者线段树】Balanced Lineup 【查询区间内最大最小值的差】
- RMQ板子 求区间最大最小值
- poj2823------线段树-------求区间最大最小值(RMQ)
- poj-2823 -- Sliding Window 区间最大值最小值 RMQ 与线段树
- POJ3264(线段树求区间最大最小值)
- UVA - 12299 RMQ with Shifts (线段树:单点修改,区间查询)
- 玲珑杯oj1149区间最大值最小值--st表
- HDU4302 - Holedox Eating(单点修改&&最大值最小值查询)
- POJ 3264 Balanced Lineup 区间查询(两棵树求最大最小值)
- 线段树求解区间最大最小值(模板)
- Codeforces_427B_Prison Transfer(一维RMQ区间查询最大值)
- 带修改的区间最大子段和
- hihocoder 1580 Matrix dp+RMQ (带修改的最大子阵和)