数据结构:ST表
BZOJ1699
在经历了树套树和主席树的洗礼之后,所有的数据结构都显得格外地亲切,和自然。。
ST算法能够实现O(nlogn)的预处理的情况下完成O(1)的区间最值查询
虽然这要求区间是静态的,也就是我们不能对区间进行修改
如果是动态的,区间最值问题,线段树或者分块儿
另外RMQ问题和LCA可以相互转化,我们回头单独介绍
这里先给出预处理:
(如果使用标准RMQ算法,可以完成O(n)的预处理,还有约束RMQ一类的问题)
void pre()
{
for(int i=;i<=n;i++)
mx[i][]=mn[i][]=a[i];
int t=log(n)/log();
for(int i=;i<=t;i++)
for(int j=n;j>;j--)
{
mx[j][i]=mx[j][i-];
if(j+(<<(i-))<=n)
mx[j][i]=max(mx[j][i],mx[j+(<<(i-))][i-]);
}
for(int i=;i<=t;i++)
for(int j=n;j>;j--)
{
mn[j][i]=mn[j][i-];
if(j+(<<(i-))<=n)
mn[j][i]=min(mn[j][i],mn[j+(<<(i-))][i-]);
}
}
其实预处理就是一个递推式
然后是查询:
int rmq(int l,int r)
{
int m=log(r-l+)/log();
int a=max(mx[l][m],mx[r-(<<m)+][m]);
int b=min(mn[l][m],mn[r-(<<m)+][m]);
return a-b;
}
最后给出完整的,实现。。。
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=;
int n,q;
int a[maxn],mn[maxn][],mx[maxn][];
void pre()
{
for(int i=;i<=n;i++)
mx[i][]=mn[i][]=a[i];
int t=log(n)/log();
for(int i=;i<=t;i++)
for(int j=n;j>;j--)
{
mx[j][i]=mx[j][i-];
if(j+(<<(i-))<=n)
mx[j][i]=max(mx[j][i],mx[j+(<<(i-))][i-]);
}
for(int i=;i<=t;i++)
for(int j=n;j>;j--)
{
mn[j][i]=mn[j][i-];
if(j+(<<(i-))<=n)
mn[j][i]=min(mn[j][i],mn[j+(<<(i-))][i-]);
}
}
int rmq(int l,int r)
{
int m=log(r-l+)/log();
int a=max(mx[l][m],mx[r-(<<m)+][m]);
int b=min(mn[l][m],mn[r-(<<m)+][m]);
return a-b;
}
int main()
{
scanf("%d%d",&n,&q);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
pre();
int x,y;
while(q--)
{
scanf("%d%d",&x,&y);
printf("%d\n",rmq(x,y));
}
return ;
}
像这种成型的算法,实在理解不了就背下来,不过要先会推导否则死翘翘,硬背是会凉的。
数据结构:ST表的更多相关文章
- 数据结构-ST表
数据结构-ST表 不可修改,在线查询的 RMQ 问题. 其中 \(f[i][j]\) 表示 \(i\sim i+(1<<j)-1\) 这段的 RMQ 值. 时间复杂度 \(O(n\log ...
- 模板 - 数据结构 - ST表/SparseTable
SparseTable,俗称ST表,其功能,就是静态的RMQ(区间最值查询)问题的解决.注意传入查询的时候两个参数的合法性,或者可以进行一次全部初始化来使得越界值不产生负面影响.不过访问越界是写程序的 ...
- 区间最值的优秀数据结构---ST表
ST表,听起来高大上,实际上限制非常多,仅仅可以求最值问题: 为什么?先从原理看起: st表运用了倍增的思想:st[i][j] = min(st[i][j - 1],st[i + 2^(j - 1)) ...
- 模板 - 数据结构 - ST表 + 二维ST表
区间最大值,$O(nlogn)$ 预处理,$O(1)$ 查询,不能动态修改.在查询次数M显著大于元素数量N的时候看得出差距. 令 $f[i][j]$ 表示 $[i,i+2^j-1]$ 的最大值. 显然 ...
- COJ 1003 WZJ的数据结构(三)ST表
WZJ的数据结构(三) 难度级别:B: 运行时间限制:3000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 请你设计一个数据结构,完成以下功能: 给定一个大小为N的 ...
- 数据结构进阶:ST表
简介 ST 表是用于解决 可重复贡献问题 的数据结构. 什么是可重复贡献问题? 可重复贡献问题 是指对于运算 \(\operatorname{opt}\) ,满足 \(x\operatorname ...
- [数据结构与算法-13]ST表
ST表 主要用来快速查询静态数据区间最大值 思路 数组\(A[i][j]\)存储数列\(\{a_i\}\)中区间\(i \in [i, i+2^j)\)的最大值 查询时只需要查询\(max\{A[i] ...
- RMQ求解->ST表
ST表 这是一种神奇的数据结构,用nlogn的空间与nlongn的预处理得出O(1)的区间最大最小值(无修) 那么来看看这个核心数组:ST[][] ST[i][j]表示从i到i+(1<<j ...
- 【笔记】自学ST表笔记
自学ST表笔记 说实话原先QBXT学的ST表忘的差不多了吧...... 我重新自学巩固一下(回忆一下) 顺便把原先一些思想来源的原博发上来 一.ST表简介 ST表,建表时间\(O(n\cdot log ...
- BZOJ 4569 [Scoi2016]萌萌哒 | ST表 并查集
传送门 BZOJ 4569 题解 ST表和并查集是我认为最优雅(其实是最好写--)的两个数据结构. 然鹅!他俩加一起的这道题,我却--没有做出来-- 咳咳. 正解是这样的: 类似ST表有\(\log ...
随机推荐
- Cortex-M3(NXP LPC 1788) 启动代码
startup_LPC177x_8x.s启动代码分析. 参考资料: Cortex-M3 (NXP LPC1788)之启动代码分析 ARM启动过程(Cortex-M3 NXP LPC1768为例) ;/ ...
- 域名加www与不加www不一样结果的解决办法
有些浏览器域名访问加www 与不加www出现的页面不一样.在aj请求的时候也不同.firefox与google新版本的都会自动加上www. 比如 访问haitaohua.com,但aj请求的时候是带w ...
- lintcode-184-最大数
184-最大数 给出一组非负整数,重新排列他们的顺序把他们组成一个最大的整数. 注意事项 最后的结果可能很大,所以我们返回一个字符串来代替这个整数. #### 样例 给出 [1, 20, 23, 4, ...
- 201621044079 week13 网络
作业13-网络 1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 为你的系统增加网络功能(购物车.图书馆管理.斗地主等)-分组完成 为了让你的系统可以 ...
- PAT 甲级 1032 Sharing
https://pintia.cn/problem-sets/994805342720868352/problems/994805460652113920 To store English words ...
- python 爬虫每天定时启动爬虫任务
# coding=utf-8 import datetime import time def doSth(): # 这里是执行爬虫的main程序 print '爬虫要开始运转了....' ...
- 【Maven】Snapshot和Release版本的区别
Snapshot版本代表不稳定.尚处于开发中的版本,快照版本. Release版本则代表稳定的版本,发行版本. 什么时候用Snapshot版本? 依赖库中的jar正处于开发的阶段,会被经常被更新,这种 ...
- TCP/IP三次握手与四次握手
原文地址 http://blog.csdn.net/whuslei/article/details/6667471 http://blog.csdn.net/wo2niliye/article/det ...
- [BZOJ5292] [BJOI2018]治疗之雨
题目链接 BZOJ:https://lydsy.com/JudgeOnline/problem.php?id=5292 洛谷:https://www.luogu.org/problemnew/show ...
- BZOJ3236:[AHOI2013]作业——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3236 第一种做法: 建两棵主席树分别处理两个问题. 第一个问题水,第二个问题参考SPOJ3267/ ...