对于带修改的区间求和能做到O(n log n)预处理,O(log n)查询;而不带修改的可以做到O(n)预处理,O(1)查询。那么不带修改的区间最值能做到O(1)查询吗?

区间最值有这样一个性质:对于一段区间的两个子区间,如果它们覆盖了整个区间(可以有重叠部分),那么这两段区间各自的最大(或最小)值的最大(或最小)值就等于整个区间的最大(或最小)值。

这样的话,可以倍增地求出从每个位置开始的2的x次方的区间最值,预处理每个数的log。查询l-r这一段区间时按如图所示的方式合并就行了。

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define maxn 100010
using namespace std;
int read()
{
int f=1,x=0;char ch=getchar();
while(isdigit(ch)==0 && ch!='-')ch=getchar();
if(ch=='-')f=-1,ch=getchar();
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
void write(int x)
{
int ff=0;char ch[15];
if(x<0)
{
x=-x;
putchar('-');
}
while(x)ch[++ff]=(x%10)+'0',x/=10;
if(ff==0)putchar('0');
while(ff)putchar(ch[ff--]);
putchar('\n');
}
struct ST
{
int st[maxn][20],logx[maxn],two[maxn];
int n,q,l,r;
void ask()
{
l=read(),r=read();
write(max(st[l][logx[r-l+1]],st[r-two[r-l+1]+1][logx[r-l+1]]));
}
void work()
{
n=read(),q=read();
for(int i=1,j=1,k=0;i<=n;i++)
{
st[i][0]=read();
if((j<<1)<=i)j<<=1,k++;
logx[i]=k;
two[i]=j;
}
for(int i=1;(1<<i)<=n;i++)
{
for(int j=1;j+(1<<(i))-1<=n;j++)
{
st[j][i]=max(st[j][i-1],st[j+(1<<(i-1))][i-1]);
// cout<<st[j][i]<<" ";
}//cout<<endl;
}
while(q--)
{
ask();
}
}//1 2 3 4 5
}t;
int main()
{
t.work();
return 0;
}/*
8 8
9 3 1 7 5 6 0 8
1 6
1 5
2 7
2 6
1 8
4 8
3 7
1 8
*/

  

并不对劲的st表的更多相关文章

  1. POJ3693 Maximum repetition substring [后缀数组 ST表]

    Maximum repetition substring Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9458   Acc ...

  2. 【BZOJ-2006】超级钢琴 ST表 + 堆 (一类经典问题)

    2006: [NOI2010]超级钢琴 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2473  Solved: 1211[Submit][Statu ...

  3. 【BZOJ-3956】Count ST表 + 单调栈

    3956: Count Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 173  Solved: 99[Submit][Status][Discuss] ...

  4. 【BZOJ-4569】萌萌哒 ST表 + 并查集

    4569: [Scoi2016]萌萌哒 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 459  Solved: 209[Submit][Status] ...

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

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

  6. HDU5726 GCD(二分 + ST表)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5726 Description Give you a sequence of N(N≤100, ...

  7. Hdu 5289-Assignment 贪心,ST表

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=5289 Assignment Time Limit: 4000/2000 MS (Java/Others) ...

  8. Bzoj 2006: [NOI2010]超级钢琴 堆,ST表

    2006: [NOI2010]超级钢琴 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2222  Solved: 1082[Submit][Statu ...

  9. ST表poj3264

      /* ST表多次查询区间最小值 设 g[j][i] 表示从第 i 个数到第 i + 2 ^ j - 1 个数之间的最小值 类似DP的说 ans[i][j]=min (ans[i][mid],ans ...

随机推荐

  1. String 工具类

    package com.mytripod.util; import sun.rmi.runtime.Log; import java.io.UnsupportedEncodingException; ...

  2. Samba 学习笔记

    这个网站不错.https://www.ibm.com/developerworks/cn/linux/l-lpic3-311-1/

  3. Go:方法

    一.基本介绍 在某些情况下,我们需要定义方法.比如 Person 结构体,除了有一些字段外(姓名.年龄...),还可以有一些行为动作(吃.唱歌...),这就需要用方法才能实现. Go中的方法是作用在指 ...

  4. 第十八节:Scrapy爬虫框架之settings文件详解

    # -*- coding: utf-8 -*- # Scrapy settings for maoyan project## For simplicity, this file contains on ...

  5. Spider-scrapy日志处理

    Scrapy生成的调试信息非常有用,但是通常太啰嗦,你可以在Scrapy项目中的setting.py中设置日志显示等级: LOG_LEVEL = 'ERROR' 日志级别 Scrapy日志有五种等级, ...

  6. 100ns周期200ns的正脉冲波形形状描述

    用FPGA控制16245产生正脉冲,正脉冲的形状是上升会有过冲现象,下降会有震荡产生,做了个实验室,用同轴电缆承载这种信号,在同轴电缆的末端会产生的波形是标准的衰减震荡. (简单的入pcb,经过继电器 ...

  7. AutoMapper 使用总结1

    初识AutoMapper 在开始本篇文章之前,先来思考一个问题:一个项目分多层架构,如显示层.业务逻辑层.服务层.数据访问层.层与层访问需要数据载体,也就是类.如果多层通用一个类,一则会暴露出每层的字 ...

  8. 解决idea创建ssm项目找不到mybatis的mapper的xml文件问题

    http://blog.csdn.net/v19freedom/article/details/69855302 后来上网搜了下,别人给出的答复 idea在build工程的时候 遇到maven项目 使 ...

  9. PyUV: Python高性能网络库

    libUV的python版本 https://github.com/saghul/pyuv

  10. MySQL查看表结构及查看建表语句

    查看表结构:desc 表名 mysql> use recommend; Database changed mysql> desc user; +--------------+------- ...