RMQ(st在线算法模板)
来源:互联网 发布:js格式化代码插件 编辑:程序博客网 时间:2024/05/16 14:17
#include<iostream>#include<cmath>#include<algorithm>using namespace std;#define M 100010#define MAXN 500#define MAXM 500int dp[M][18];/**一维RMQ ST算法*构造RMQ数组 makermq(int n,int b[]) O(nlog(n))的算法复杂度*dp[i][j] 表示从i到i+2^j -1中最小的一个值(从i开始持续2^j个数)*dp[i][j]=min{dp[i][j-1],dp[i+2^(j-1)][j-1]}*查询RMQ rmq(int s,int v)*将s-v 分成两个2^k的区间*即 k=(int)log2(s-v+1)*查询结果应该为 min(dp[s][k],dp[v-2^k+1][k])*/void makermq(int n,int b[]){ int i,j; for(i=1;i<=n;i++) dp[i][0]=b[i]; for(j=1;(1<<j)<=n;j++) for(i=1;i+(1<<j)-1<=n;i++) dp[i][j]=min(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);}int rmq(int s,int v){ int k=(int)(log((v-s+1)*1.0)/log(2.0)); return min(dp[s][k],dp[v-(1<<k)+1][k]);}void makeRmqIndex(int n,int b[]) //返回最小值对应的下标{ int i,j; for(i=1;i<=n;i++) dp[i][0]=i; for(j=1;(1<<j)<=n;j++) for(i=1;i+(1<<j)-1<=n;i++) dp[i][j]=b[dp[i][j-1]] < b[dp[i+(1<<(j-1))][j-1]]? dp[i][j-1]:dp[i+(1<<(j-1))][j-1];}int rmqIndex(int s,int v,int b[]){ int k=(int)(log((v-s+1)*1.0)/log(2.0)); return b[dp[s][k]]<b[dp[v-(1<<k)+1][k]]? dp[s][k]:dp[v-(1<<k)+1][k];}int main(){ int a[]={3,4,5,7,8,9,0,3,4,5}; //返回下标 makeRmqIndex(sizeof(a)/sizeof(a[0]),a); cout<<rmqIndex(0,9,a)<<endl; cout<<rmqIndex(4,9,a)<<endl; //返回最小值 makermq(sizeof(a)/sizeof(a[0]),a); cout<<rmq(0,9)<<endl; cout<<rmq(4,9)<<endl; return 0;}
0 0
- RMQ(st在线算法模板)
- ST算法(RMQ模板)
- RMQ ST 算法模板
- RMQ(ST算法)模板
- ST算法 rmq 模板
- RMQ ST算法模板
- RMQ算法(ST实现在线查询)
- RMQ中的ST算法模板
- LCA在线算法(RMQ st算法的结合)
- 算法基础 - RMQ-ST算法(在线算法)
- RMQ(ST算法)
- RMQ(ST算法)
- ST(RMQ)算法(在线)求LCA
- RMQ问题 在线算法-ST算法
- 【静态RMQ问题ST-在线算法】
- ST算法解RMQ模板(洛谷1816 忠诚)
- RMQ算法(ST算法)
- rmq的st算法及模板
- hdu 2566 统计硬币
- 黑马程序员----异常处理机制的概括
- Java基础50问与答
- spring的IOC和DI
- Kafka命令行常用命令说明
- RMQ(st在线算法模板)
- 01 java.lang.Object
- xxxccc
- 通向码农的道路(服务器架构设计(一))
- HDU 2066 一个人的旅行 dijkstra&&spfa
- 优化Android Studio/Gradle构建
- 静态链表(五)
- 多线程(二) GCD
- [笔记]iOS开发之多线程GCD和NSOperation基本使用