博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
st算法 求区间最值问题
阅读量:6884 次
发布时间:2019-06-27

本文共 1191 字,大约阅读时间需要 3 分钟。

算法的一个实现方法如下。

其中使用位运算替代2的幂次的计算,加快运算速度。

使用时需要先调用initRMQ()进行初始化,然后再调用RMQ(u,v)进行查询。

1 const int mx = 10000 + 10;  //数组最大长度 2 int n, a[mx]; //数组长度,数组内容 3  4 int st[mx][30]; //DP数组 5 void initRMQ() 6 { 7     for (int i = 0; i < n; i++) st[i][0] = a[i]; 8     for (int j = 1; (1 << j) <= n; j++) //使用位运算加速 9         for (int i = 0; i + (1 << j) - 1 < n; i++)10             st[i][j] = min(st[i][j-1], st[i+(1<<(j-1))][j-1]);11 }12 13 int RMQ(int u, int v)14 {15     int k = (int)(log(v-u+1.0) / log(2.0)); //类型转换优先级高,除法整体要加括号16     return min(st[u][k], st[v-(1<
View Code

有时候需要得到最值的下标而不是最值内容

1 const int mx = 10000 + 10;  //数组最大长度 2 int n, a[mx]; //数组长度,数组内容 3  4 int st[mx][30]; //DP数组 5 void initRMQIndex()  6 { 7     for (int i = 0; i < n; i++)        st[i][0] = i; 8     for (int j = 1; (1 << j) <= n; j++) 9         for (int i = 0; i + (1 << j) - 1 < n; i++)10             st[i][j] = a[st[i][j-1]] < a[st[i+(1<<(j-1))][j-1]] ? 11                                     st[i][j-1] : st[i+(1<<(j-1))][j-1];12 }13 14 int RMQIndex(int s, int v) //返回最小值的下标15 {16     int k = int(log(v-s+1.0) / log(2.0));17     return a[st[s][k]] < a[st[v-(1<
View Code

 

转载于:https://www.cnblogs.com/cyd308/p/4667584.html

你可能感兴趣的文章
使用百度地图实现详细地址自动补全(补全bug''事件只能绑定到一个上的问题')...
查看>>
Emoji表情处理工具类
查看>>
刚刚考过dev401,出去玩了!有时间我把题目给大家贴出来。
查看>>
不等式解法训练题
查看>>
JavaScriptResult用法
查看>>
Hibernate(一)初始Hebirnate
查看>>
unity_ UI
查看>>
loj#6437. 「PKUSC2018」PKUSC(计算几何)
查看>>
CF1110G Tree-Tac-Toe(博弈论)
查看>>
iOS 百度地图大头针使用
查看>>
Linux 源码编译Python 3.6
查看>>
Hibernate-ORM:01.Hibernate恍如隔世般初见
查看>>
更新数据+获取行号+某行记录的地址+from字句
查看>>
goto,null
查看>>
the way of reading English books
查看>>
文本超出部分省略(包括多行文本超出部分省略显示)
查看>>
MongoDB数据库索引
查看>>
jq 操作表单中 checkbox 全选 单选
查看>>
高并发和大流量解决方案@year12
查看>>
模板:排序(三)
查看>>