[笔记]区间最值RMQ---ST
来源:互联网 发布:2012年欧洲杯决赛 知乎 编辑:程序博客网 时间:2024/06/15 06:03
一.定义:(出自百度百科)
对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,也就是说,RMQ问题是指求区间最值的问题。
二.概括
算法实质是DP再加上倍增思想(与LCA的在线算法差不多)
三.基本思路
用d[i][j]表示以i为起点,2^j内的区间[i,i+2^j-1]内数的极值
预处理:(盗走蓝书上的图)
ps:默认d1[i][0]=d2[i][0]=ai
inline void get_RMQ(int n){ for(int j=1;(1<<j)<=n;++j) for(int i=1;i+(1<<j)-1<=n;++i) { d1[i][j]=min(d1[i][j-1],d1[i+(1<<(j-1))][j-1]);//最小值 d2[i][j]=max(d2[i][j-1],d2[i+(1<<(j-1))][j-1]);//最大值 }}
查询:
继续盗图
inline int get_k(int x){ int k; for(k=0;(1<<k)<=x;++k); return k-1; //保证2^(k-1)>=(1/2)*(j-i+1)}inline int query(int x,int y){ int k=get_k(y-x+1); return max(d2[x][k],d2[y-(1<<k)+1][k]);//最大值 return min(d1[x][k],d1[y-(1<<k)+1][k]);//最小值}
四.例题 [洛谷 2880]
题目大意:求区间最大值与区间最小值的差
代码:
#include <cstdio>#include <cstdlib>#define open(s) freopen(s".in","r",stdin); freopen(s".out","w",stdout);#define close fclose(stdin); fclose(stdout); using namespace std;int d1[50005][20];int d2[50005][20];inline int read(){ int k=1; int sum=0; char c=getchar(); for(;'0'>c || c>'9' ;c=getchar()) if(c=='-') k=-1; for(;'0'<=c && c<='9';c=getchar()) sum=sum*10+c-'0'; return sum*k;}inline void write(int x){ if(x<0) { putchar('-'); x*=-1; } if(x>9) write(x/10); putchar(x%10+'0');}inline int min(int x,int y){ return x<y?x:y;}inline int max(int x,int y){ return x>y?x:y;}inline int get_k(int x){ int k; for(k=0;(1<<k)<=x;++k); return k-1;}inline int query(int x,int y){ int k=get_k(y-x+1); return max(d2[x][k],d2[y-(1<<k)+1][k])-min(d1[x][k],d1[y-(1<<k)+1][k]);}int main(){ open("2880"); int n=read(),m=read(); for(int i=1;i<=n;++i) d1[i][0]=d2[i][0]=read(); get_rmq(n); for(int i=1;i<=m;++i) { int x=read(),y=read(); write(query(x,y)); putchar('\n'); } close; return 0;}
阅读全文
0 0
- [笔记]区间最值RMQ---ST
- RMQ的ST(区间最值)
- HiHo #1068 : RMQ-ST算法 【ST求区间最值】
- RMQ(模板 ST 区间最值,区间频繁次数)
- RMQ+ST 区间最值/区间最多频次
- RMQ(区间最值问题)ST算法
- RMQ之ST算法(求区间最值问题)
- ST算法求解区间最值(简介) RMQ
- hihoCoder 1068 : RMQ-ST算法 (区间最值查询之 rmq算法)
- 区间最值 RMQ
- RMQ(区间最值)
- rmq区间最值
- rmq(区间最值)
- POJ 3264 Balanced Lineup RMQ问题 ST算法 O(1)查找区间最值
- 快速查询区间最值——RMQ算法(ST实现)
- RMQ 区间最值问题
- RMQ区间最值问题
- RMQ求区间最值
- tomcat 7/8 启动非常慢的解决方法
- 通过yarn 查看完整的hql语句
- 操作系统---基本原理
- hdoj 3836 Equivalent Sets
- 纯js实现分页 原理:所有数据已加载好 js通过遍历部分显示 实现分页效果
- [笔记]区间最值RMQ---ST
- [code forces] 762A
- Redhat中ifconfig命令不能使用怎么办?
- SaltStack命令大全
- Oracle数据库知识和SQL语句总结
- elasticsearch5.4.0 生产环境部署 及插件 ik + head +kibana
- 关于include指令和include动作的区别
- 前端开发问题总结
- HDU 5791 Two——DP