题目背景

这是一道ST表经典题——静态区间最大值

请注意最大数据时限只有0.8s,数据强度不低,请务必保证你的每次查询复杂度为 O(1) O(1)

题目描述

给定一个长度为 N N 的数列,和 M M 次询问,求出每一次询问的区间内数字的最大值。

输入输出格式

输入格式:
第一行包含两个整数 N, M N,M ,分别表示数列的长度和询问的个数。

第二行包含 N 个整数,依次表示数列的第 i 项。

接下来 M 行,每行包含两个整数 表示查询的区间

输出格式:
输出包含 M M 行,每行一个整数,依次表示每一次询问的结果。

输入输出样例

输入样例#1: 复制
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
输出样例#1: 复制
9
9
7
7
9
8
7
9
说明

n<=100000 m<=1000000

ST表,倍增思想O(nlogn)预处理,O(1)查询。

#include<iostream>
#include<cstdio>
#include<cmath> using namespace std;
const int MAXN = 100005; int n,m,f[MAXN][20],t,a[MAXN]; inline void ST(){
for(register int i=1;i<=n;i++) f[i][0]=a[i];
for(register int j=1;j<t;j++)
for(register int i=1;i<=n-(1<<j)+1;i++)
f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
} int main(){
scanf("%d%d",&n,&m);
t=int(log(n)/log(2))+1;
for(register int i=1;i<=n;i++)
scanf("%d",&a[i]);
ST();
for(register int i=1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
t=int(log(y-x+1)/log(2));
int ans=max(f[x][t],f[y-(1<<t)+1][t]);
printf("%d\n",ans);
}
}

最新文章

  1. LeetCode - Two Sum
  2. road习题(二)
  3. webdriver对象定位方法
  4. c#后台进行窗体切换的方法
  5. 3、CC2541芯片中级教程-OSAL操作系统(ADC光敏电阻和修改串口波特率)
  6. Spark Core源代码分析: Spark任务运行模型
  7. android Animation笔记
  8. web services 接口测试方法
  9. JS监听组合按键
  10. 自定义TabHost,TabWidget样式
  11. 关于方法的ref
  12. apache如何设置缓存
  13. hdu 5012(bfs)
  14. Markdown工具Atom及基本语法
  15. jquery固定表头和列头
  16. SSM登录跳转到登录页,登录页不能加载js和样式
  17. intel FPGA使用
  18. mode=&quot;r&quot; 和 函数末尾调用 regist()!!!!
  19. Spring源码分析(十六)准备创建bean
  20. ASP.NET MVC4在View中调用当前Controller中的方法

热门文章

  1. Web server failed to start. Port 8080 was already in use.
  2. list集合获取相同以及不同的对象
  3. HTML5中的Canvas和SVG
  4. HBase与Sqoop集成案例
  5. 剑指offer——丑数(c++)
  6. C语言新手写扫雷攻略4
  7. R语言中样本平衡的几种方法
  8. git分布式版本控制系统权威指南学习笔记(五):git checkout
  9. Codeforces 1173B Nauuo and Chess
  10. GIT 学习第二天 (二)