RMQ问题之ST算法
时间:2019-01-31
本文章向大家介绍RMQ问题之ST算法,主要包括RMQ问题之ST算法使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
- ST算法
ST算法是用于解决RMQ问题(区间最值问题)的一种强有力的工具。
O(nlogn)预处理,O(1)查询最值,利用的是倍增的思想。
但…但是,使用ST算法的条件是没有修改操作,emmm - 算法流程(最大值为例)
①预处理
用f[i][j]表示,从i位置开始的2^j 个数中的最大值,例如f[i][j]表示的是a[i][i+2^j-1]这个区间的最大值。
转移的时候我们可以把当前区间拆成两个区间并分别取最大值。
f[i][j]分为f[i][j-1]和f[i+2^(j-1)][j-1]
②询问
询问左端点l,右端点r;
k=log2(r-l+1)
然后对于左端点和右端点分别进行查询,这样可以保证一定可以覆盖查询的区间。
左端点查询区间[l,l+2^k-1]
右端点查询区间[r-2^k+1,r]
讲的可能比较抽象,可以画个图好好理解一下 - 代码实现
代码就比较好理解了,需要注意的:1.加减乘除的优先级高于位运算 2.双重循环外层是j,下面附模板ST算法代码
const int maxn=1e5+5;
int n,m,x,y;
int a[maxn],f[maxn][21];
int query(int l,int r)
{
int k=log2(r-l+1);
return max(f[l][k],f[r-(1<<k)+1][k]);
}
int main()
{
scanf("%d%d",&n,&m);
for(R i=1;i<=n;++i) scanf("%d",&a[i]);
for(R i=1;i<=n;++i)
f[i][0]=a[i];
for(R j=1;j<=21;++j)//计算f[i][j],外层j!
for(R i=1;i+(1<<j)-1<=n;++i)//边界条件
f[i][j]=max(f[i][j-1],f[i+(1<<j-1)][j-1]);//加减优先级高于位运算
while(m--)
{
scanf("%d%d",&x,&y);
printf("%d\n",query(x,y));
}
return 0;
}
- 就快是猪年啦,提前祝新年快乐,菜鸡新年也要继续加油鸭
- IE7下当position:fixed遇到text-align:center
- 数组-在Shell脚本中的基本使用介绍
- .Net Core下通过Proxy 模式 使用 WCF
- javascript中function调用时的参数检测常用办法
- squid代理http和https方式上网的操作记录
- kvm虚拟化管理平台WebVirtMgr部署-完整记录(3)
- 域名hiku.com曾百万价格被交易,目前被加拿大大麻公司收购
- Linux系统下的用户密码设定梳理
- Silverlight中的序列化
- 第四次工业革命
- 每周.NET前沿技术文章摘要(2017-06-07)
- 再谈Silverlight中的对象序列化/反序列化
- jQuery打造智能提示插件
- 每周.NET前沿技术文章摘要(2017-05-17)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法