2017-08-26 22:25:57

writer:pprp

题意很简单,给你一串数字,问你给定区间中最大值减去给定区间中的最小值是多少?

用ST表即可实现

一开始无脑套模板,找了最大值,找了最小值,分别用两个函数实现,实际上十分冗余

所以TLE了

之后改成一个函数中同时处理最大值和最小值,就可以了

AC代码如下:

/*
@theme:poj 3264
@writer:pprp
@declare:ST表(sparse table)稀疏表,用动态规划的思想来解决RMQ问题;
@date:2017/8/26
*/ //#include <bits/stdc++.h>
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#define IOS ios::sync_with_stdio(false),cin.tie(0); using namespace std;
const int maxn = ; int F1[maxn][];
int F2[maxn][];
int a[maxn]; void SparseTable(int a[], int len)
{
//初始化
for(int i = ; i < len ; i++)
{
F1[i][] = a[i];
F2[i][] = a[i];
} //递推
//找到j的范围log2(n)
int nlog = int(log(double(len))/log(2.0));
for(int j = ; j <= nlog; j++)
{
for(int i = ; i < len ; i++)
{
//区间右端点不能超过数组最后一位下标
if((i + ( << j) -) < len )
{
F1[i][j] = min(F1[i][j - ],F1[i + ( << (j - ))][j - ]);
F2[i][j] = max(F2[i][j - ],F2[i + ( << (j - ))][j - ]);
}
}
}
} int main()
{
int N, Q;
int l, r; scanf("%d %d",&N,&Q); for(int i = ; i < N ; i++)
{
scanf("%d",&a[i]);
} SparseTable(a,N); for(int i = ; i < Q ; i++)
{
scanf("%d %d",&l,&r);
l--;
r--;
double len = r - l + ;
int m = (int)(log(len)/log(2.0));
int mmx = max(F2[l][m],F2[r-(<<m)+][m]);
int mmn = min(F1[l][m],F1[r-(<<m)+][m]);
printf("%d\n",mmx-mmn);
} return ;
}

最新文章

  1. Codeforces Round #209 (Div. 2) A. Table
  2. Odoo 二次开发教程【一】 Odoo 的安装
  3. Qt之模拟时钟
  4. UML系列01之 UML用例图
  5. [转]Freemarker数据类型转换
  6. 频繁模式挖掘apriori算法介绍及Java实现
  7. CentOS 7 Root用户密码重置 2017-04-02
  8. 201521123049 《JAVA程序设计》 第12周学习总结
  9. C# 冒泡法
  10. Golang 嵌套map赋值办法
  11. ubuntu 创建文件夹和删除文件
  12. 配置java-jdk
  13. laravel使用过程总结
  14. grpc-golang实现账号and密码认证
  15. 牛客练习赛1 B - 树
  16. nginx防盗链配置
  17. 我与虚拟机的初次接触及初探Liux命令 20155338
  18. python设计模式之内置装饰器使用(四)
  19. 配置tomcat映射jsp
  20. WebSocket 是什么原理?为什么可以实现持久连接?(转载)

热门文章

  1. vue下给title配置图标.ico
  2. matrix---简单dp,边界边界-_-
  3. Win10新建文件不自动刷新
  4. Golang&amp;Python测试thrift
  5. LINUX内核分析20133201
  6. Sping-Spring JDBC框架
  7. SpringBoot-URL路由:@Controller和@RequestMapping
  8. hibernate 单向 n-n
  9. Ignite缓存管理初体验
  10. 玩转DOM遍历——用NodeIterator实现getElementById,getElementsByTagName方法