ST表,一个十分神奇的东西,需要O(nlogn)的时间预处理,但是他查询只需要O(1)。

看似与线段树等数据结构时间复杂度一样,但是ST表的复杂度只在于预处理,预处理之后可以当做不耗时!

而想线段树这种东西,查询是O(logn)的,一旦与其他复杂度乘在一起,就会发现TLE离你不远了!

面对不会修改数据的题,ST表妥妥的第一选择!

好了,现在开始补kzsn一直没学完全明白的ST表!

ST表主要支持不修改的区间的查询,运用了倍增的思想。

#include<bits/stdc++.h>
using namespace std;
#define re register int
#define LL long long const int N=2e6+6; int lg[N], f[N][23];//用多少,开多少,kzsn心里记住了
signed main()
{
int n, m;scanf("%d%d",&n,&m);
for(re i=1;i<=n;++i)
{
scanf("%d",&f[i][0]);
if(i>1) lg[i]=lg[i>>1]+1; // 预处理 log2
}
// f[i][j] 记录了区间 [j, j+(1<<i)-1]的区间最值
// 值得注意的是,ST表以及其他倍增的东西,倍增的大小一定要放数组第一位,这样更快。
for(re i=1; i<=20; ++i) // 枚举倍增区间
{
for(re j=1; j+(1<<i)-1 <= n; ++j) // 区间起点
{
f[j][i] = max(f[j][i-1], f[j+(1<<(i-1))][i-1]);
// 这里求区间 [j, j+(1<<i)-1]的区间最值
// 可以转化成区间 [j, j+(1<<i-1)-1] 以及区间 [j+(1<<i-1), j+(1<<i)-1]
// 千万注意这里的各种减1,kzsn就是这里不太搞得懂!
}
}
while(m--)
{
int l, r;
scanf("%d%d",&l,&r);
int s = lg[r-l+1];
// 查询区间[l,r],变成查询两个区间
// [l,l+(1<<s)-1] [r-(1<<s)+1, r],两区间重叠的部分对于答案没有影响的!!
printf("%d\n", max(f[l][s], f[r-(1<<s)+1][s]));
}
return 0;
}

希望以后kzsn不要再忘记ST表了!!!

ST表 ----kzsn考挂后有感的更多相关文章

  1. Interviewe HDU - 3486 (ST表+枚举 )(非二分,看下这个数据、)

    YaoYao has a company and he wants to employ m people recently. Since his company is so famous, there ...

  2. [多校联考2019(Round 4 T2)][51nod 1288]汽油补给(ST表+单调栈)

    [51nod 1288]汽油补给(ST表+单调栈) 题面 有(N+1)个城市,0是起点N是终点,开车从0 -> 1 - > 2...... -> N,车每走1个单位距离消耗1个单位的 ...

  3. BZOJ 4556: [Tjoi2016&Heoi2016]字符串(后缀数组 + 二分答案 + 主席树 + ST表 or 后缀数组 + 暴力)

    题意 一个长为 \(n\) 的字符串 \(s\),和 \(m\) 个询问.每次询问有 \(4\) 个参数分别为 \(a,b,c,d\). 要你告诉它 \(s[a...b]\) 中的所有子串 和 \(s ...

  4. 【NOI2010】超级钢琴 题解(贪心+堆+ST表)

    题目链接 题目大意:求序列内长度在$[L,R]$范围内前$k$大子序列之和. ---------------------- 考略每个左端点$i$,合法的区间右端点在$[i+L,i+R]$内. 不妨暴力 ...

  5. 【BZOJ-4310】跳蚤 后缀数组 + ST表 + 二分

    4310: 跳蚤 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 180  Solved: 83[Submit][Status][Discuss] De ...

  6. ST表入门学习poj3264 hdu5443 hdu5289 codeforces round #361 div2D

    ST算法介绍:[转自http://blog.csdn.net/insistgogo/article/details/9929103] 作用:ST算法是用来求解给定区间RMQ的最值,本文以最小值为例 方 ...

  7. BZOJ 2006: [NOI2010]超级钢琴 [ST表+堆 | 主席树]

    题意: 一个序列,求k个不相同的长度属于\([L,R]\)的区间使得和最大 前缀和,对于每个r找最小的a[l] 然后我yy了一个可持久化线段树做法...也许会T 实际上主席树就可以了,区间k小值 然后 ...

  8. [BZOJ1012] [JSOI2008] 最大数maxnumber (ST表)

    Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插 ...

  9. BZOJ_4516_[Sdoi2016]生成魔咒_后缀数组+ST表+splay

    BZOJ_4516_[Sdoi2016]生成魔咒_后缀数组+ST表+splay Description 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1.2 拼凑起来形成一个魔 ...

随机推荐

  1. 基于Ubuntu18.04一站式部署(python-mysql-redis-nginx)

    基于Ubuntu18.04一站式部署 Python3.6.8的安装 1. 安装依赖 ~$ sudo apt install openssl* zlib* 2. 安装python3.6.8(个人建议从官 ...

  2. python库--pandas--Series.str--字符串处理

    原数据 import pandas as pd a = pd.Series(['aSd', 'asd', 'dfd fsAsf sfs']) b = pd.Series([None, 'asd', ' ...

  3. 解决umount: /home: device is busy

    取消挂载/home时出现umount: /home: device is busy,        原因是因为有程序在使用/home目录,我们可以使用fuser查看那些程序的进程,        然后 ...

  4. 彻底搞明白PHP中的include和require

    在PHP中,有两种包含外部文件的方式,分别是include和require.他们之间有什么不同呢? 如果文件不存在或发生了错误,require产生E_COMPILE_ERROR级别的错误,程序停止运行 ...

  5. dedecms织梦调用指定文章id

    {dede:arclist idlist="1349"  channelid="1" addfields="date,city"} idli ...

  6. Docker系列(10)- 常用命令小结

    #橙色前面笔记已记录,黑色后面笔记将完善#勤加练习!!!attach Attach to a running container # 当前 shell 下 attach 连接指定运行镜像 build ...

  7. php laravel v5.1 消息队列

    * install https://laravel.com/docs/5.1#installationcomposer create-project laravel/laravel msgq &quo ...

  8. PHP-设计模式之-中介者模式

    <?php//中介者模式 -- //抽象中介者abstract class UnitedNationa{ punlic abstract function Declared($message,c ...

  9. git 报错 gitThere is no tracking information for the current branch. Please specify which branch you w

    新建本地分支后将本地分支推送到远程库, 使用git pull 或者 git push 的时候报错gitThere is no tracking information for the current ...

  10. django中csrf_token处理方式

    第一:先在HTML中加入{% csrf_token %} $.ajax({ url: '{% url "ceshi:list" %}', type: 'post', dataTyp ...