RMQ 的 ST算法模版
来源:互联网 发布:mac显示终端什么意思 编辑:程序博客网 时间:2024/04/27 13:58
转自gx巨巨http://blog.csdn.net/u012350533/article/details/14645881
/*ST算法:基于动态规划求区间最值的算法。分为预处理和查询两部分预处理:定义 F[i][j] 为从 i开始到 i+2^j-1 区间内的最值 , 我们可以讲这段2^j的区间分成两部分长度都为2^(j-1)的相同区间区间1 为 i.....i+2^(j-1)-1 区间2为 i+2^(j-1).....i+2^j-1那么可以得到 F[i][j] =Max( F[i][j-1],F[i+2^(j-1)][j-1],边界条件为F[i][0]=A[i].由于大的区间是由小的区间得到的,所以预处理时必须按区间长度递增的顺序递推出F[i][j]. 查询:求区间[ i , j ]的最值 令 d=(int) log2( j-i+1) 我们取靠i的长度为2^d区间 以及靠j的2^d区间内的最大值 ,两个区间内可以存在公共部分 则i,j max= Max ( F[i][d] ,F[j-2^d+1,d]) 题意:要求找出区间内的最大最小值的差。用两个数组分别保存区间最大和最小值*/
#include<stdio.h>#include<string.h>#include<math.h>#include<iostream>using namespace std;const int MAXN = 100100;int n,query;int A[MAXN];int FMin[MAXN][20],FMax[MAXN][20];void Init(){int i,j;for(i=1;i<=n;i++)FMin[i][0]=FMax[i][0]=A[i];for(i=1;(1<<i)<=n;i++){ //按区间长度递增顺序递推 for(j=1;j+(1<<i)-1<=n;j++){ //区间起点 FMin[j][i]=min(FMin[j][i-1],FMin[j+(1<<(i-1))][i-1]);FMax[j][i]=max(FMax[j][i-1],FMax[j+(1<<(i-1))][i-1]);}} }int Query(int l,int r){int k=(int)(log(double(r-l+1))/log((double)2));return max(FMax[l][k],FMax[r-(1<<k)+1][k]);}int main(){int i,a,b;scanf("%d %d",&n,&query);for(i=1;i<=n;i++) scanf("%d",&A[i]);Init();while(query--){scanf("%d %d",&a,&b);printf("%d\n",Query(a,b));}return 0;}
- RMQ 的 ST算法模版
- RMQ 的ST算法 【模版】+【知识点】
- RMQ的ST算法
- RMQ的ST算法
- RMQ的ST算法
- RMQ问题的ST算法
- RMQ问题的ST算法
- RMQ的st算法详解
- RMQ问题的ST算法
- RMQ算法以及LCA的ST算法。
- rmq的st算法及模板
- RMQ问题的ST算法详解
- RMQ问题的ST算法读书笔记
- 针对RMQ问题的ST算法
- 转载用ST的RMQ算法
- poj3264-RMQ问题的ST算法
- rmq-st算法
- RMQ问题ST算法
- JAVA语言用正则表达式统计代码量
- Eclipse汉化后如何还原为EN英文(实用技巧)
- mysql 分组
- javascript 正则表达式应用 【test和search】
- 常用的css选择器
- RMQ 的 ST算法模版
- javascript 对象的创建
- Linux操作系统下完全删除Oracle数据库(10g)
- 最新天气预报接口【2015-05-14改】
- Android的file文件操作详解
- kindeditor 4.1.8 整合struts2 (Action版本)过程总结
- VS + QT 写代码时自动补全
- 修改DNS重启后依然生效
- 关于easy_install重装