数据结构: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 ...
随机推荐
- Python的string模块化方法
Python 2.X中曾经存在过一个string模块,这个模块里面有很多操作字符串的方法,但是在Python 3.X中,这些模块化方法已经被移除了(但是string模块本身没有被移除,因为它还有其他可 ...
- Easy Summation
Description You are encountered with a traditional problem concerning the sums of powers. Given two ...
- File Searching
Description Have you ever used file searching tools provided by an operating system? For example, in ...
- Alpha阶段中间产物——Thunder团队
Part One 版本控制 git地址:https://git.coding.net/lick468/iReader.git Part Two 软件功能说明书 相关链接:http://www.cnbl ...
- Java微笔记(2)
Java 中方法的重载 一,如果同一个类中包含了两个或两个以上方法名相同.方法参数的个数.顺序或类型不同的方法,则称为方法的重载,也可称该方法被重载了 二,.判断方法重载的依据: 1. 必须是在同一个 ...
- vuex管理页面标题
1.在store -> mutation-types.js文件新增常量 export const UPDATE_TITLE = 'UPDATE_TITLE' 2.新增文件title.js目录结构 ...
- Qt代码覆盖率code coverage(VS版)
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt代码覆盖率code coverage(VS版) 本文地址:http://techi ...
- php中的<?= ?>替换<?php echo ?>
首先修改PHP.ini文件.如下: 1. 将short_open_tag = Off 改成On 开启以后可以使用PHP的短标签:<? ?> <?= $test ?>来代替 &l ...
- Redis 学习之集群
该文使用centos6.5 64位 redis3.2.8 一. redis-cluster架构图 集群通信:所有redis节点之间通过PING-PONG机制彼此互联,内部使用二进制鞋子优化传输速度 ...
- Django 2.0 学习(13):Django模板继承和静态文件
Django模板继承和静态文件 模板继承(extend) Django模板引擎中最强大也是最复杂的部分就是模板继承了,模板继承可以让我们创建一个基本的"骨架"模板,它可以包含网页中 ...