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表的更多相关文章

  1. 数据结构-ST表

    数据结构-ST表 不可修改,在线查询的 RMQ 问题. 其中 \(f[i][j]\) 表示 \(i\sim i+(1<<j)-1\) 这段的 RMQ 值. 时间复杂度 \(O(n\log ...

  2. 模板 - 数据结构 - ST表/SparseTable

    SparseTable,俗称ST表,其功能,就是静态的RMQ(区间最值查询)问题的解决.注意传入查询的时候两个参数的合法性,或者可以进行一次全部初始化来使得越界值不产生负面影响.不过访问越界是写程序的 ...

  3. 区间最值的优秀数据结构---ST表

    ST表,听起来高大上,实际上限制非常多,仅仅可以求最值问题: 为什么?先从原理看起: st表运用了倍增的思想:st[i][j] = min(st[i][j - 1],st[i + 2^(j - 1)) ...

  4. 模板 - 数据结构 - ST表 + 二维ST表

    区间最大值,$O(nlogn)$ 预处理,$O(1)$ 查询,不能动态修改.在查询次数M显著大于元素数量N的时候看得出差距. 令 $f[i][j]$ 表示 $[i,i+2^j-1]$ 的最大值. 显然 ...

  5. COJ 1003 WZJ的数据结构(三)ST表

    WZJ的数据结构(三) 难度级别:B: 运行时间限制:3000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 请你设计一个数据结构,完成以下功能: 给定一个大小为N的 ...

  6. 数据结构进阶:ST表

    简介 ST 表是用于解决 可重复贡献问题 的数据结构. 什么是可重复贡献问题? ​ 可重复贡献问题 是指对于运算 \(\operatorname{opt}\) ,满足 \(x\operatorname ...

  7. [数据结构与算法-13]ST表

    ST表 主要用来快速查询静态数据区间最大值 思路 数组\(A[i][j]\)存储数列\(\{a_i\}\)中区间\(i \in [i, i+2^j)\)的最大值 查询时只需要查询\(max\{A[i] ...

  8. RMQ求解->ST表

    ST表 这是一种神奇的数据结构,用nlogn的空间与nlongn的预处理得出O(1)的区间最大最小值(无修) 那么来看看这个核心数组:ST[][] ST[i][j]表示从i到i+(1<<j ...

  9. 【笔记】自学ST表笔记

    自学ST表笔记 说实话原先QBXT学的ST表忘的差不多了吧...... 我重新自学巩固一下(回忆一下) 顺便把原先一些思想来源的原博发上来 一.ST表简介 ST表,建表时间\(O(n\cdot log ...

  10. BZOJ 4569 [Scoi2016]萌萌哒 | ST表 并查集

    传送门 BZOJ 4569 题解 ST表和并查集是我认为最优雅(其实是最好写--)的两个数据结构. 然鹅!他俩加一起的这道题,我却--没有做出来-- 咳咳. 正解是这样的: 类似ST表有\(\log ...

随机推荐

  1. Python的string模块化方法

    Python 2.X中曾经存在过一个string模块,这个模块里面有很多操作字符串的方法,但是在Python 3.X中,这些模块化方法已经被移除了(但是string模块本身没有被移除,因为它还有其他可 ...

  2. Easy Summation

    Description You are encountered with a traditional problem concerning the sums of powers. Given two ...

  3. File Searching

    Description Have you ever used file searching tools provided by an operating system? For example, in ...

  4. Alpha阶段中间产物——Thunder团队

    Part One 版本控制 git地址:https://git.coding.net/lick468/iReader.git Part Two 软件功能说明书 相关链接:http://www.cnbl ...

  5. Java微笔记(2)

    Java 中方法的重载 一,如果同一个类中包含了两个或两个以上方法名相同.方法参数的个数.顺序或类型不同的方法,则称为方法的重载,也可称该方法被重载了 二,.判断方法重载的依据: 1. 必须是在同一个 ...

  6. vuex管理页面标题

    1.在store -> mutation-types.js文件新增常量 export const UPDATE_TITLE = 'UPDATE_TITLE' 2.新增文件title.js目录结构 ...

  7. Qt代码覆盖率code coverage(VS版)

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt代码覆盖率code coverage(VS版)     本文地址:http://techi ...

  8. php中的<?= ?>替换<?php echo ?>

    首先修改PHP.ini文件.如下: 1. 将short_open_tag = Off 改成On 开启以后可以使用PHP的短标签:<? ?> <?= $test ?>来代替 &l ...

  9. Redis 学习之集群

    该文使用centos6.5 64位  redis3.2.8 一.  redis-cluster架构图 集群通信:所有redis节点之间通过PING-PONG机制彼此互联,内部使用二进制鞋子优化传输速度 ...

  10. Django 2.0 学习(13):Django模板继承和静态文件

    Django模板继承和静态文件 模板继承(extend) Django模板引擎中最强大也是最复杂的部分就是模板继承了,模板继承可以让我们创建一个基本的"骨架"模板,它可以包含网页中 ...