ST表——————一失足成千古恨系列2
在此先祝自己这个系列写的越少越好qwq(保证不超过4篇(flag已立))
考试原题:(绝壁是看完复联出的)

第一反应:线段树??不对,是st表。嗯,没错。哎,st表咋写来着??完了凉了。
结果:写暴搜的都有60分,结果我爆了0 qwq
80-->0,与键盘无缘嘤嘤嘤
好了开始说正事
ST表用来干什么的?
给定一个区间,求最值。上面那道题是典型的模板题(虽然有毒瘤数据会卡掉st表,但我们这里不讨论)
复杂度:预处理:O(nlogn),询问:O(1)
先说预处理。
st表示一个二维数组,其中st[i][j]表示区间[i,i+2^j-1]中的最值,这里我们就拿最大值举例。显然st[i][0]=a[i],因为[i,i+1-1]中只有i一个点。那么我们怎么推其他的st[i][j]呢?
我们先来看一张图

这样我们就可以推出来:st[i][j]=max(st[i][j-1],st[i+(1<<(j-1))][j-1]。为什么呢?因为i+2^(j-1)+2^(j-1)-1=i+2*(2^(j-1))-1=i+2^j-1
这样,我们就可以预处理出来所有的st[i][j]了
int st[maxn][]//一般第二维不会超过20,这里是应对毒瘤数据范围
void init()
{
for(int i=;i<=n;i++)
st[i][]=a[i];
for(int i=;(<<i)<=n;i++)//这里实际上枚举上面说的j
{for(int j=;j+(<<i)-<n;j++)
{st[j][i]=max(st[j][i-],st[j+(<<(i-))][i-]);//这里为什么j是第一维呢?这里我们max()里面变的只有第一维,所以我们要先处理第一维,才能保证后面正常进行(就是个顺序问题)
}
}
}
查询给的区间可不是卡好2^k的,所以我们应该怎么查询呢?我们第二维表示的是i+2^j-1,我们看到这里有个次方,我们可以玄学的考虑一下log。(以2为底)
这里区间的长度显然是2^j,我们已经考虑到log,那不妨对区间长度len=2^j来个log.(向下取整),设t=log(len)/log(2)向下取整,那么2^t一定<len/2。我们发现,l+2^t一定是在[l,r]的中间往右,而r-2^t一定在中间往左。[l,l+2^t-1]与[r-2^t+1,r]这两个区间是可以完全覆盖[l,r],而且还不会有超出[l,r]的部分,所以我们就可以从st[l][t]和st[r-2^t+1][t]中选一个最大值。
Update
由于窝之前的代码是手糊的,所以出了锅。误导了您真的十分十分抱歉(我发4再也不手糊代码了qwq)
真·能AC板子的代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#define pa pair<int,int>
#include<ctime>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf=;
inline ll read()
{
char ch=getchar();
ll x=;
bool f=;
while(ch<''||ch>'')
{
if(ch=='-') f=;
ch=getchar();
}
while(ch>=''&&ch<='')
{
x=(x<<)+(x<<)+(ch^);
ch=getchar();
}
return f?-x:x;
}
int n,m,a[],st[][];
int lg[];
int qry(int l,int r)
{
int qwq=log((double)(r-l+))/log(2.0);
return max(st[l][qwq],st[r-(<<qwq)+][qwq]);
}
int main()
{
n=read();m=read();
for(int i=;i<=n;i++)
{
a[i]=read();
st[i][]=a[i];
}
for(int i=;(<<i)<=n;i++)
{
for(int j=;j<=n;j++)
{
st[j][i]=max(st[j][i-],st[j+(<<(i-))][i-]);
}
}
while(m--)
{
int l=read(),r=read();
printf("%d\n",qry(l,r));
}
}
ST表——————一失足成千古恨系列2的更多相关文章
- POJ3693 Maximum repetition substring [后缀数组 ST表]
Maximum repetition substring Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9458 Acc ...
- 【BZOJ-2006】超级钢琴 ST表 + 堆 (一类经典问题)
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2473 Solved: 1211[Submit][Statu ...
- 【BZOJ-3956】Count ST表 + 单调栈
3956: Count Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 173 Solved: 99[Submit][Status][Discuss] ...
- 【BZOJ-4569】萌萌哒 ST表 + 并查集
4569: [Scoi2016]萌萌哒 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 459 Solved: 209[Submit][Status] ...
- 【BZOJ-4310】跳蚤 后缀数组 + ST表 + 二分
4310: 跳蚤 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 180 Solved: 83[Submit][Status][Discuss] De ...
- HDU5726 GCD(二分 + ST表)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5726 Description Give you a sequence of N(N≤100, ...
- Hdu 5289-Assignment 贪心,ST表
题目: http://acm.hdu.edu.cn/showproblem.php?pid=5289 Assignment Time Limit: 4000/2000 MS (Java/Others) ...
- Bzoj 2006: [NOI2010]超级钢琴 堆,ST表
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2222 Solved: 1082[Submit][Statu ...
- ST表poj3264
/* ST表多次查询区间最小值 设 g[j][i] 表示从第 i 个数到第 i + 2 ^ j - 1 个数之间的最小值 类似DP的说 ans[i][j]=min (ans[i][mid],ans ...
随机推荐
- StringBuffer 和Stringbuilder源码分析
首先看一下他们的继承关系 这个两个对象都继承了AbstractStringBuilder抽象类. 1.他们的实现方式都一样的,唯一区别的StringBuffer在多线程的时候是保证了数据安全, ...
- Layerui 弹出层的位置设置
距顶 offset: '300px' 例1: layer.msg("请先选择项!", { offset: '300px' });例2: layer.confirm("确定 ...
- getCurrentSession 与 openSession区别
getCurrentSession () 使用当前的session openSession()重新建立一个新的session 使用SessionFactory.getCurrentSession()需 ...
- dfs(枚举)
http://codeforces.com/gym/100989/problem/L L. Plus or Minus (A) time limit per test 1.0 s memory lim ...
- HTML5随记
1.浏览器加载HTML的过程是从上至下,因此引用的第三方js文件一定要放到自己定义的js文件的前面,否则引入的js文件将会在加载时失效. 2.html的全局属性包括:accesskey.content ...
- JVM调优 dump文件怎么生成和分析
1.获取JVM的dump文件的两种方式 1. JVM启动时增加两个参数: #出现 OOME 时生成堆 dump: -XX:+HeapDumpOnOutOfMemoryError #生成堆文件地址: - ...
- Webpack4、iView、Vue开发环境的搭建
导读 项目使用了 yarn ,一个快速.可靠.安全的依赖管理工具.yarn 是一个类似于npm的包管理工具,它是由 facebook 推出并开源,它在速度,离线模式,版本控制的方面具有独到的优势.此项 ...
- 收集慕课网讲解的border知识
1.使用boeder辅助background-posi定位 2.使用border实现三道杠图标 3.利用border实现--鼠标放上去后,改变图标的颜色
- ZPL文件打印
ZPL:全称是Zebra Printer Language,目前能够直接打印zpl文件的打印机只有斑马打印机 如何打印zpl文件呢? 软件类: 一.Print Conductor(桌面打印软件) ht ...
- Ionic创建混合App(一)
前言 最近公司要开始做App项目,最终选定了ionic开发方案,在这里我将学习的过程记录在这里,一方面避免自己忘记,另一方面方便大家交流学习.这里我们采用的是 Ionic2 + Angular2 : ...