RMQ算法详解(持续更新 )
来源:互联网 发布:有没有听音识谱软件 编辑:程序博客网 时间:2024/05/20 17:26
一维RMQ算法模版:
void RMQ(){ for(int i=1;i<=n;i++) dp1[i][0]=dp2[i][0]=num[i]; for(int j=1;(1<<j)<=n;j++) { for(int i=1;i+(1<<j)-1<=n;i++) { dp1[i][j]=max(dp1[i][j-1],dp1[i+(1<<(j-1))][j-1]); dp2[i][j]=min(dp2[i][j-1],dp2[i+(1<<(j-1))][j-1]); } }}int ST(int l,int r){ int k=0; while((1<<(k+1))<=r-l+1) k++; int ans1=max(dp1[l][k],dp1[r-(1<<k)+1][k]); int ans2=min(dp2[l][k],dp2[r-(1<<k)+1][k]);// printf("%d %d\n",ans1,ans2); return ans1-ans2;}
经典例题:
1.51nod 1174 区间中最大的数(简单水题)
题目链接:
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=117
代码:
#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define inf 0x3f3f3f3f#define met(a,b) memset(a,b,sizeof(a))const int maxn = 5e4+10;int num[maxn];int dp1[maxn][20];//int dp2[maxn][20];int n,q;void RMQ(){ for(int i=1;i<=n;i++) dp1[i][0]=num[i]; for(int j=1;(1<<j)<=n;j++) { for(int i=1;i+(1<<j)-1<=n;i++) { dp1[i][j]=max(dp1[i][j-1],dp1[i+(1<<(j-1))][j-1]);// dp2[i][j]=min(dp2[i][j-1],dp2[i+(1<<(j-1))][j-1]); } }}int ST(int l,int r){ int k=0; while((1<<(k+1))<=r-l+1) k++; int ans1=max(dp1[l][k],dp1[r-(1<<k)+1][k]);// int ans2=min(dp2[l][k],dp2[r-(1<<k)+1][k]);// printf("%d %d\n",ans1,ans2); return ans1;}int main(){ while(scanf("%d",&n)!=EOF) { for(int i=1;i<=n;i++) scanf("%d",&num[i]); RMQ(); scanf("%d",&q); while(q--) { int a,b; scanf("%d%d",&a,&b); printf("%d\n",ST(a+1,b+1)); } }}
2.PKU 3264
题目链接:
http://poj.org/problem?id=3264
代码:
#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define inf 0x3f3f3f3f#define met(a,b) memset(a,b,sizeof(a))const int maxn = 5e4+10;int num[maxn];int dp1[maxn][20];int dp2[maxn][20];int n,q;void RMQ(){ for(int i=1;i<=n;i++) dp1[i][0]=dp2[i][0]=num[i]; for(int j=1;(1<<j)<=n;j++) { for(int i=1;i+(1<<j)-1<=n;i++) { dp1[i][j]=max(dp1[i][j-1],dp1[i+(1<<(j-1))][j-1]); dp2[i][j]=min(dp2[i][j-1],dp2[i+(1<<(j-1))][j-1]); } }}int ST(int l,int r){ int k=0; while((1<<(k+1))<=r-l+1) k++; int ans1=max(dp1[l][k],dp1[r-(1<<k)+1][k]); int ans2=min(dp2[l][k],dp2[r-(1<<k)+1][k]);// printf("%d %d\n",ans1,ans2); return ans1-ans2;}int main(){ while(scanf("%d%d",&n,&q)!=EOF) { for(int i=1;i<=n;i++) scanf("%d",&num[i]); RMQ(); while(q--) { int a,b; scanf("%d%d",&a,&b); printf("%d\n",ST(a,b)); } }}
阅读全文
0 0
- RMQ算法详解(持续更新 )
- RMQ 算法详解
- RMQ算法详解
- RMQ算法详解
- RMQ算法详解
- rmq算法详解 模板
- RMQ算法详解
- 学习算法的计划(持续更新)
- 图像增强算法(持续更新中)
- 算法(持续更新)For Java
- 一些小算法(持续更新)
- 图论基础算法(持续更新)
- 排序算法持续更新(部分转载)
- Javascript排序算法(持续更新中...)
- 排序算法总结(持续更新中)
- 关于排序算法(持续更新)
- java排序算法(持续更新)
- 排序算法(持续更新...)
- 通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败。错误:“Connection refused: connect的问题
- iOS 在cell中使用倒计时的处理方法(新)
- C++之C语言混合编程学习笔记
- JAVA 反射一撇
- 使用ASM实现AOP(2) -- 玩转 ASM-Bytecode
- RMQ算法详解(持续更新 )
- 网络请求需要的依赖
- libc.so.6: version 'GLIBC_2.15' not found
- h264 获取每个nal
- TCP 为什么是三次握手,为什么不是两次或四次?
- Windows下配置Node.js和Cordova
- AngularJS —— 使用模块组织你的代码 【已翻译100%】(1/3)
- Android Choreographer 源码分析
- 移动端虚拟键盘遮挡页面输入框等元素的解决方案