题目大意:给出一段序列,每次查询一段区间,求区间最大值。

ST表:设原序列为A,定义F[i][k]为A[i][2k-1]的最大值。有递归式:F[i][k]=max(F[i][k-1], F[i+2k-1][k-1])。设置F时,外层循环k,内部循环i。查询时,令k为2^k不超过r-l+1的最大k,返回max(F[l][i], F[r-i+1][i])(利用幂等操作)即可。

注意OffOne错误(看代码中的注释)。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int MAX_N = 100010, MAX_K = 17; struct ST
{
private:
int F[MAX_N][MAX_K]; public:
int A[MAX_N];
int N; void SetF()
{
for (int i = 0; i < N; i++)
F[i][0] = A[i];
for (int k = 1; (1 << k) <= N; k++)
for (int i = 0; i + (1 << k) - 1 < N; i++)//F[i][k]管理的是A[i, i+2^k-1],别忘了后面有-1
F[i][k] = max(F[i][k - 1], F[i + (1 << (k - 1))][k - 1]);//子问题只与i, k-1有关,与无关,故<<后k都要-1.
} int Query(int l, int r)
{
int i;
for (i = 0; (1 << (i + 1)) <= r - l + 1; i++);//2^k不超过r-l+1,所以<<后面i要+1.
return max(F[l][i], F[r - (1 << i) + 1][i]);//看F定义,(1<<i)后有 +1.
}
}g; int main()
{
#ifdef _DEBUG
freopen("c:\\noi\\source\\input.txt", "r", stdin);
#endif
int queryCnt;
scanf("%d%d", &g.N, &queryCnt);
for (int i = 0; i < g.N; i++)
scanf("%d", g.A + i);
g.SetF();
while (queryCnt--)
{
int l, r;
scanf("%d%d", &l, &r);
printf("%d\n", g.Query(l - 1, r - 1));
}
return 0;
}

  

最新文章

  1. asp.net core 使用protobuf
  2. ios更新UI时请尝试使用performSelectorOnMainThread方法
  3. 【PowerOJ1740&amp;网络流24题 圆桌聚餐】(最大流)
  4. java基础类和对象-题
  5. github for windows 桌面版使用方法
  6. 在SoCEDS环境下编译和更新preloader和uboot程序的方法
  7. python ndentationError: unexpected indent
  8. ViewController 之间设置转场动画
  9. iostat来对linux硬盘IO性能进行了解
  10. 常用数据结构[OpenCV 笔记12]
  11. c/c++的函数参数压栈顺序
  12. Oracle SQL ANY和ALL语句
  13. 上市ASCII 表省内发现!
  14. ThinkPad E431/E531 ubuntu 14.04 安装无线网卡驱动
  15. 通过ant-jmeter读取jtl文件拆分数据并insert DB
  16. 【前端】javascript实现导航栏筋斗云效果特效
  17. 动态添加div及对应的js、css文件
  18. 痞子衡嵌入式:语音处理工具Jays-PySPEECH诞生记(5)- 语音识别实现(SpeechRecognition, PocketSphinx0.1.15)
  19. Java爬虫之下载全世界国家的国旗图片
  20. js常见的几种继承方式

热门文章

  1. HBase编程 API入门系列之delete(客户端而言)(3)
  2. window.dialogArguments
  3. 关于MVC4.0版本以上的RegisterBundles用法
  4. 学习廖雪峰的Python教程之Python基础
  5. 相机标定:PNP基于单应面解决多点透视问题
  6. C#异步Async、Task、Await
  7. CorelDRAW2019版本下载,CorelDRAW最新版新增功能(全)
  8. 用Python来实现斐波那契数列.
  9. mysql修改原始密码
  10. 【转载】Java 反射详解