ST表简介 (洛谷P3865、洛谷P2251)
来源:互联网 发布:1025实验室 知乎 编辑:程序博客网 时间:2024/06/05 20:46
算法用途
Sparse Table,又称ST表,稀疏表。运用倍增的思想,可以解决RMQ,LCA等问题。其优点是在线查询。预处理复杂度为O(nlogn),查询复杂度为O(1)。
算法思想
运用倍增的思想,num[i][j]表示区间[i,i+(1
算法实现
以求最大值为例:
① 对于预处理,有如下转移方程式:
num[i][j]=max(num[i][j-1],num[i+(1<<j-1)][j-1]);
这是什么东西啊??
我们来推一遍:
其实只是把[i,i+(1
所以这个区间的最大值就是这两个区间的最大值的较大者。
然后就推好啦!
② 对于查询[x,y]之间的最大值,我们可以这样:
int j=log2(y-x+1);printf("%d\n",max(num[x][j],num[y-(1<<j)+1][j]));
这又是什么东西??
我们再来推一遍:
num[x][j]表示[x,x+(1
模板
以洛谷P3865 为例:
#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define MAXN 150000using namespace std;int n,m;int num[MAXN+5][18];inline char readc(){ static char buf[100000],*l=buf,*r=buf; if (l==r) r=(l=buf)+fread(buf,1,100000,stdin); if (l==r) return EOF; return *l++;}int _read(){ int num=0; char ch=readc(); while (ch<'0'||ch>'9') ch=readc(); while (ch>='0'&&ch<='9'){ num=num*10+ch-48; ch=readc(); } return num;}void make(){ for (int i=1;i<18;i++) for (int j=1;j+(1<<i)-1<=n;j++) num[j][i]=max(num[j][i-1],num[j+(1<<i-1)][i-1]);}int main(){ n=_read(); m=_read(); for (int i=1;i<=n;i++) num[i][0]=_read(); make(); for (int i=1;i<=m;i++){ int x=_read(),y=_read(); int j=log2(y-x+1); printf("%d\n",max(num[x][j],num[y-(1<<j)+1][j])); } return 0;}
再来个最小值(洛谷P2251):
#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define MAXN 1500000using namespace std;int num[MAXN+5][21],q[MAXN+5];int n,m;inline char readc(){ static char buf[100000],*l=buf,*r=buf; if (l==r) r=(l=buf)+fread(buf,1,100000,stdin); if (l==r) return EOF; return *l++;}int _read(){ int num=0; char ch=readc(); while (ch<'0'||ch>'9') ch=readc(); while (ch>='0'&&ch<='9') { num=num*10+ch-48; ch=readc(); } return num;}void make(){ for (int j=1;j<=20;j++) for (int i=1;i<=n;i++) num[i][j]=min(num[i][j-1],num[i+(1<<j-1)][j-1]);}int main(){ n=_read(); m=_read(); for (int i=1;i<=n;i++) num[i][0]=_read(); make(); for (int i=1;i<=n-m+1;i++){ int x=i,y=m+i-1; int j=log2(y-x+1); q[i]=min(num[x][j],num[y-(1<<j)+1][j]); } for (int i=1;i<=n-m+1;i++) printf("%d\n",q[i]); return 0;}
阅读全文
1 0
- ST表简介 (洛谷P3865、洛谷P2251)
- [洛谷P3865] ST表
- 洛谷 P2251 质量检测(st表)
- 洛谷P2251 质量检测
- 洛谷1594 护卫队 (st算法)
- ST表(Sparse Table)
- codevs2173忠诚(st表)
- ST(稀疏表)算法
- Luogu 3865(st表)
- ST算法解RMQ模板(洛谷1816 忠诚)
- ST表
- st表
- st表
- st表
- ST表
- st表
- ST表
- ST表
- Revit中Dynamo编程——在Python中怎么利用RevitAPI来写一个过滤
- 定位系统环境变量
- bootstrap实现商品主页面 代码
- FME转换CAD至SHP,实现注记到多边形字段传递
- LeetCode 算法习题 第三周
- ST表简介 (洛谷P3865、洛谷P2251)
- python 下运行redis
- OHEM算法论文理解
- 数组中超过一半的数字
- Android有条件的设置横屏或竖屏
- 关于链表的倒数第k个结点的查找问题--考研题
- 2. 变量和基本类型
- Spark代码Eclipse远程调试
- ubuntu boot 空间不足