命题描述

给定一个长度为 \(n\) 的序列,\(m\) 次询问区间最大值

分析

上面的问题肯定可以暴力对吧。

但暴力肯定不是最优对吧,所以我们直接就不考虑了。。。

于是引入:倍增

首先,倍增是个什么东西?

在这里转一篇写的超棒的blog,点我。要是这都没看懂你就连小白兔都不如我就无语了。

总的来说,其实就是倒着运用二分的思想,从需求小的慢慢倍增把答案更新到需求大的

ST表就是一种常见的倍增思想的运用

关于ST表

ST表和树状数组,线段树这两种算法一样,是一种用于解决 \(RMQ(Range Minimum/Maximum Query)\)多次区间查询问题的离线算法

ST表的主要思想是构建一个二维数组 \(st[i][j]\),这个二维数组表示需要查询的数组的从下标 \(i\) 到下标 \(i + 2^{j - 1}\) 的最值,这里以最大值为例。超像 \(dp\) 的说~

我们可以把 \([i, j]\) 拆成数量相等的两半,在求出这两部分的最大值即可,故:

  1. st[i][j] = max(st[i][j - 1], st[i + (1 << (j - 1))][j - 1];

再枚举一下 \(i, j\) 就可以了。点儿都不高级


接下来,该怎么实现查询呢?

如果查询的区间长度刚好是 \(2^k(k为整数)\),直接输出 \(st[l][log(r - l + 1) / log(2)]\) 即可;

如果不是,也很简单,我们还是将所给区间分为两部分。

首先规定在 \(st[i][j]\) 中 \(i = l\),\(j = k\),区间长度 \(len = r - l + 1\)。

会发现最大的\(k\) 应满足 \(2^k <= len\) (这样以 \(l\) 开头的ST表数据覆盖需要查询的区间中的数最多)

所以 \(k = (int) (log(len)/log(2))\)

显然查询时的区间 \([l,r]\) 分成的右边部分的左端点 \(x = r + 1 - 2^p\)

具体实现
  1. #include <cstdio>
  2. #include <cmath>
  3. #include <algorithm>
  4. using namespace std;
  5. const int MAXN = 100005;
  6. int st[MAXN][41];
  7. void read(int &a) { // 读优
  8. int k = 1;
  9. a = 0;
  10. char s = getchar();
  11. while(s < '0' || s > '9') {
  12. if(s == '-') k = -1;
  13. s = getchar();
  14. }
  15. while(s >= '0' && s <= '9') {
  16. a = a * 10 + (s - '0');
  17. s = getchar();
  18. }
  19. a *= k;
  20. }
  21. int main() {
  22. int n, m;
  23. read(n); read(m);
  24. for(int i = 1; i <= n; i++) read(st[i][0]);
  25. for(int j = 1; j <= (int)(log(n) / log(2)); j++)
  26. for(int i = 1; i + (1 << j) - 1 <= n; i++)
  27. st[i][j] = max(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]);
  28. for(int i = 1; i <= m; i++) {
  29. int l, r;
  30. read(l); read(r);
  31. int k = (int)(log(r - l + 1) / log(2));
  32. printf("%d\n", max(st[l][k], st[r - (1 << k) + 1][k]));
  33. }
  34. return 0;
  35. }

浅谈 倍增/ST表的更多相关文章

  1. 浅谈对ST表的一些理解

    今天打了人生第一道ST表题(其实只是ST表跑得最快); ST表是一种用来解决RMQ问题的利器... 大体操作有两步: 第一部分nlogn预处理 第二部分O(1)询问 预处理就是运用倍增+区间动规 ST ...

  2. P7599-[APIO2021]雨林跳跃【二分,倍增,ST表】

    正题 题目链接:https://www.luogu.com.cn/problem/P7599 题目大意 \(n\)棵树,在某棵树上时可以选择向左右两边第一棵比它高的树跳,现在\(q\)次询问从\([A ...

  3. 【BZOJ1047】[HAOI2007]理想的正方形 (倍增ST表)

    [HAOI2007]理想的正方形 题目描述 有一个\(a*b\)的整数组成的矩阵,现请你从中找出一个\(n*n\)的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: ...

  4. 浅谈倍增LCA

    题目链接:https://www.luogu.org/problemnew/show/P3379 刚学了LCA,写篇blog加强理解. LCA(Least Common Ancestors),即最近公 ...

  5. 【编程学习】浅谈哈希表及用C语言构建哈希表!

    哈希表:通过key-value而直接进行访问的数据结构,不用经过关键值间的比较,从而省去了大量处理时间. 哈希函数:选择的最主要考虑因素--尽可能避免冲突的出现 构造哈希函数的原则是: ①函数本身便于 ...

  6. Sql server 浅谈用户定义表类型

    1.1 简介 SQL Server 中,用户定义表类型是指用户所定义的表示表结构定义的类型.您可以使用用户定义表类型为存储过程或函数声明表值参数,或者声明您要在批处理中或在存储过程或函数的主体中使用的 ...

  7. 浅谈MySQL分表

    关于分表:顾名思义就是一张数据量很大的表拆分成几个表分别进行存储. 我们先来大概了解以下一个数据库执行SQL的过程: 接收到SQL --> 放入SQL执行队列 --> 使用分析器分解SQL ...

  8. poj 3264 倍增 ST表

    #include<iostream> #include<cmath> using namespace std; ; int a[maxn]; ]; ]; int quick(i ...

  9. 图书管理(Loj0034)+浅谈哈希表

    图书管理 题目描述 图书管理是一件十分繁杂的工作,在一个图书馆中每天都会有许多新书加入.为了更方便的管理图书(以便于帮助想要借书的客人快速查找他们是否有他们所需要的书),我们需要设计一个图书查找系统. ...

随机推荐

  1. 【故障公告】访问高峰数据库服务器 CPU 100% 引发全站故障

    今天上午11:10,我们又中"奖"了,我们使用的阿里云 RDS 实例(SQL Server 2016 标准版,16核32G)突发出现 CPU 100%,引发全站故障,直到 12:1 ...

  2. pandas神器操作excel表格大全(数据分析数据预处理)

    使用pandas库操作excel,csv表格操作大全 关注公众号"轻松学编程"了解更多,文末有公众号二维码,可以扫码关注哦. 前言 准备三份csv表格做演示: 成绩表.csv su ...

  3. Dapr实现分布式有状态服务的细节

    Dapr是为云上环境设计的跨语言, 事件驱动, 可以便捷的构建微服务的系统. balabala一堆, 有兴趣的小伙伴可以去了解一下. Dapr提供有状态和无状态的微服务. 大部分人都是做无状态服务(微 ...

  4. 快快使用ModelArts,零基础小白也能玩转AI!

    摘要: 走过路过不要错过,看Copy攻城狮如何借力华为云ModelArts玩转AI. "自2018年10月发布以来,ModelArts累计服务了众多行业十几万开发者,通过基础平台的完备性和面 ...

  5. [Codeforces 553E]Kyoya and Train(期望DP+Floyd+分治FFT)

    [Codeforces 553E]Kyoya and Train(期望DP+Floyd+分治FFT) 题面 给出一个\(n\)个点\(m\)条边的有向图(可能有环),走每条边需要支付一个价格\(c_i ...

  6. 微信小程序获取普通二维码

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  7. 【填坑往事】Android手机锁屏人脸解锁优化过程实录

    背景 写这篇文章,主要是为了以后面试方便.因为我简历上写了,上一份工作的最大亮点是将人脸解锁的速度由1200ms优化到了600ms,所以这些内容已经回答无数遍了.但每次总觉得回答的不完整,或者说总感觉 ...

  8. Vue常用性能优化

    Vue常用性能优化 Vue常用的一些优化方式,主要是在构建项目过程需要注意的方面. 编码优化 避免响应所有数据 不要将所有的数据都放到data中,data中的数据都会增加getter和setter,并 ...

  9. 我发现了一个特别Man的Linux工具!!!

    Linux命令不用我多说吧,谁还不会几个?但是一个命令可能有几十种用法,就拿最简单也是最常用的ls来举例,它就有将近20种options用法 比如 ls -a :现实所有文件及其隐藏文件 ls -t ...

  10. 庐山真面目之四微服务架构Consul集群和Nginx版本实现

    庐山真面目之四微服务架构Consul集群和Nginx版本实现 一.简介      在上一篇文章<庐山真面目之三微服务架构Consul版本实现>中,我们已经探讨了如何搭建基于单节点Consu ...