【笔记+模板】ST 表
来源:互联网 发布:买刷枪软件 编辑:程序博客网 时间:2024/04/29 04:50
算法流程
应用
应用于求给定序列中满足区间加法的值(如max,min),以最大值为例
不支持序列修改,如果修改,则需推倒重建
预处理
数组f[i][j]表示以j为开始的长度为2^i的序列的最大值 f[i][j]=max(f[i-1][j],f[i-1][j+num[i-1]]);
递推预处理出f数组
在线查询
查询区间[l,r]的最大值 k=log2(r-l+1)
变量k是区间长度的log值
max(f[k][x],f[k][y-num[k]+1])
[x,x+2^k] [y-2^k+1,y] 能够完全覆盖所求区间,可能有重合,但不会遗漏
题目
https://www.luogu.org/problemnew/show/P3865
给定序列,多次询问[l,r]的最大值
代码
#include<iostream>#include<cstdio>#include<cmath>#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)?(a):(b))using namespace std;const int N=100000+500;int n,m,k,x,y;int f[25][N],num[30];int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scanf("%d",&f[0][i]); } for(int i=0;i<=25;i++) num[i]=(1<<(i));//稍微开大一点,防止越界 k=log2(n)+1; for(int i=1;i<=k;i++){ for(int j=1;j+num[i-1]<=n;j++){//注意j的取值范围 f[i][j]=max(f[i-1][j],f[i-1][j+num[i-1]]); } } for(int i=1;i<=m;i++){ scanf("%d%d",&x,&y); k=log2(y-x+1); printf("%d\n",max(f[k][x],f[k][y-num[k]+1])); } return 0;}
阅读全文
0 0
- 【笔记+模板】ST 表
- ST表LCA模板
- 个人模板 ST表
- ST表模板
- 【模板】ST稀疏表
- ST 表 模板
- 【模板】st表
- ST表模板
- st表模板
- [模板]ST表
- ST表学习笔记
- CF Hello 2015 A ST表模板
- st表模板,以最小值为例
- codeforces 689D ST表+二分 模板
- ST表模板(维护区间最大值)
- <st表模板> codevs 2173 忠诚
- RMQ ST表学习笔记
- HeadFir st 设计模式学习笔记8--模板方法模式
- spark checkpoint机制简述
- TV盒子上获取外插USB路径名称
- STL模拟实现List+迭代器
- CentOS7使用firewalld打开关闭防火墙与端口
- Hibernate-配置详解(一)
- 【笔记+模板】ST 表
- log4j日志的使用
- POJ
- 会计程序编写.
- ZBrush有多少版本?ZBrush下载集合
- 用Verilog HDL语言实现UART通信
- leetcode题解-8. String to Integer (atoi)
- 复归
- Python 字符串操作方法大全