RMQ-ST 详细讲解 poj3264为例
来源:互联网 发布:手机midi键盘软件 编辑:程序博客网 时间:2024/06/05 18:58
首先介绍一下什么是RMQ。RMQ (Range Minimum/Maximum Query)问题是指求区间最值的问题,这个问题用线段树同样可以解决。
线段树解决方法
ST
ST算法是解决RMQ问题较优的算法,它是基于动态规划和位运算实现的。它可以通过O(
我们设dp[i][j]是区间[i,i+
所以当我们要求解dp[i][j]时我们可以把它分为两部分,每部分数的个数均为
这样我们就得出了状态转移方程
dp[i][j] = max/min(dp[i][j-1],dp[i+(1<<(j-1))][j-1])
当我们查询任意区间[l,r]的最值的时候,先计算出该区间有多少个数(len=r-l+1),然后我们把它分为两个区间(这两个区间可以重叠但必须包含[l,r]中所有数),这样我们直接取这两个区间的最值即可。
现在关键问题就是怎么分这两个区间,其实就是计算
所以ans=max/min(dp[l][k],dp[r-(1<<(k))+1][k])
poj3264
题意
给你n个数和q次询问,(n<=50000,q<=200000),每次询问区间[l,r]中最大值和最小值的差。
题解
就是裸题,直接维护最大值和最小值即可。
代码
//#include <bits/stdc++.h>#include <cstdio>#include <cstdlib>#include <cmath>#include <cstring>#include <algorithm>using namespace std;typedef long long ll;const int maxn = 5e5+5;int ma[maxn][20],mi[maxn][20];int n,m;void ST(int len){ int k = (int)(log((double)len)/log(2.0)); for(int j=1;j<=k;j++) { for(int i=1;i+(1<<j)-1<=len;i++) { ma[i][j] = max(ma[i][j-1],ma[i+(1<<(j-1))][j-1]); mi[i][j] = min(mi[i][j-1],mi[i+(1<<(j-1))][j-1]); } }}int RMQ(int l,int r){ int k = (int)(log((double)(r-l+1))/log(2.0)); int ans1 = max(ma[l][k],ma[r-(1<<k)+1][k]); int ans2 = min(mi[l][k],mi[r-(1<<k)+1][k]); return ans1-ans2;}int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&ma[i][0]),mi[i][0]=ma[i][0]; ST(n); int l,r; for(int i=1;i<=m;i++) { scanf("%d%d",&l,&r); printf("%d\n",RMQ(l,r)); } return 0;}
- RMQ-ST 详细讲解 poj3264为例
- poj3264 Balanced Lineup(RMQ +st)
- POJ3264 Balanced Lineup (RMQ & ST)
- poj3264 rmq问题——st算法
- RMQ(ST 与 线段树)eg poj3264
- RMQ问题 ST 算法总结 poj3264
- poj3264-RMQ问题的ST算法
- POJ3264 Balanced Lineup 线段树 RMQ ST算法应用
- POJ3264 RMQ问题 裸 线段树 OR ST算法
- POJ3264 【RMQ基础题—ST-线段树】
- RMQ POJ3264
- RMQ poj3264
- poj3264--RMQ
- POJ3264/RMQ
- poj3264(RMQ)
- poj3264(ST)
- poj3264(ST算法)
- POJ3264 RMQ问题
- plsql 连接 虚拟机Linux下的Oracle数据库 失败
- java volatile关键字
- null或空值的判断处理-java
- ASP.NET Core MVC四种枚举绑定方式
- ubuntu fwupd占用一个cpu100%解决办法
- RMQ-ST 详细讲解 poj3264为例
- DPMM的理解、公式推导及抽样
- LeetCode
- 【LeetCode】Longest Common Subsequence最长公共子序列(求出某一解+LCS长度)
- 多址接入技术 FDMA TDMA CDMA NOMA
- python下用find命令行直接遍历某文件夹下的数据并按顺序写入txt文档中
- idea快捷键
- 圆梦会计软件 v64绿色版
- 练习(17.09.06)