RMQ问题 - ST表的简单应用
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 ;
}
RMQ问题 - ST表的简单应用的更多相关文章
- 线段树(two value)与树状数组(RMQ算法st表)
士兵杀敌(三) 时间限制:2000 ms | 内存限制:65535 KB 难度:5 描述 南将军统率着N个士兵,士兵分别编号为1~N,南将军经常爱拿某一段编号内杀敌数最高的人与杀敌数最低的人进行比 ...
- RMQ求解->ST表
ST表 这是一种神奇的数据结构,用nlogn的空间与nlongn的预处理得出O(1)的区间最大最小值(无修) 那么来看看这个核心数组:ST[][] ST[i][j]表示从i到i+(1<<j ...
- Codeforces 803G Periodic RMQ Problem ST表+动态开节点线段树
思路: (我也不知道这是不是正解) ST表预处理出来原数列的两点之间的min 再搞一个动态开节点线段树 节点记录ans 和标记 lazy=-1 当前节点的ans可用 lazy=0 没被覆盖过 els ...
- RMQ、ST表
ST表 \(\text{ST}\) 表是用于解决可重复贡献问题的数据结构. 可重复贡献问题:区间按位和.区间按位或.区间 \(\gcd\) .区间最大.区间最小等满足结合律且可重复统计的问题. 模板预 ...
- RMQ(ST表)
#include<iostream> #include<cstdio> #include<cmath> using namespace std; int N, M, ...
- RMQ的st表算法
此算法可用来处理区间最值问题,预处理时间为O(nlogn),查询时间为O(1) 此算法主要基于倍增思想,用以数组st[i][j]表示从第i个元素开始向后搜2的j次方的最值 可用递推的方式求得:st[i ...
- 【模板】RMQ问题 ST表
洛谷3865 #include<cstdio> #include<algorithm> #include<cmath> using namespace std; ; ...
- 51Nod.1766.树上最远点对(树的直径 RMQ 线段树/ST表)
题目链接 \(Description\) 给定一棵树.每次询问给定\(a\sim b,c\sim d\)两个下标区间,从这两个区间中各取一个点,使得这两个点距离最远.输出最远距离. \(n,q\leq ...
- [模板]ST表浅析
ST表,稀疏表,用于求解经典的RMQ问题.即区间最值问题. Problem: 给定n个数和q个询问,对于给定的每个询问有l,r,求区间[l,r]的最大值.. Solution: 主要思想是倍增和区间d ...
随机推荐
- Python3.6编译安装以及python开发之virtualenv与virtualenvwrapper
Python3.6编译安装 下载python源码包 先到安装目录 cd /opt 下载源码包 wget https://www.python.org/ftp/python/3.6.2/Python-3 ...
- freemarker学习#1
在工作的过程中遇到了.ftl文件.打开发现里面是一些类似于html的代码,非常好奇这是一种什么样的文件,于是去网上搜了一下,了解到.ftl是Freemarker模板的文件后缀名.将问题转移到了Free ...
- 从HD OJ 1005想到的
杭电OJ [1005](http://acm.hdu.edu.cn/showproblem.php?pid=1005): #####Problem Description > A number ...
- python学习笔记(十一)redis的介绍及安装
一.redis简介 1.redis是一个开源的.使用C语言编写的.支持网络交互的.可基于内存也可持久化的Key-Value数据库. 2.redis的官网地址,非常好记,是redis.io. ...
- UVA10954:Add All(优先队列)
题目:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=68990#problem/O 题目需求:在数组中拿出两个数相加,再把结果放回数组中再 ...
- vim树形目录
NERD tree树形目录插件 • 插件简介 NERD tree是一款vim树形文件资源管理器插件.NERD tree可以让你在vim中浏览你的文件系统,打开想要的文件或目录. • 插件安装 ▶ 下载 ...
- The adidas NMD XR1 singapore is a bit more cool
The adidas NMD Singapore continues to be the right silhouette for summer time because of a mix of a ...
- Dom与Bom,增删改查
对Web标准的理解:web标准是由一系列标准组合而成的,页面有三个部分组成:结构,表现和行为.因而web标准即由结构化标准语言主要有 xml和xhtml,表现标准语言css,行为标准主要包括对象模型( ...
- iClap是什么,能解决什么问题?
移动互联网时代,APP体验度.用户粘性和活跃度关乎企业命脉,但是市面上使用的办公工具却不足以解决企业存在的问题,iClap应运而生,颠覆互联网企业的传统协作方式,改变了种子用户与企业的互动方式,为企业 ...
- Salesforce学习第一天
好久没有在博客园发布学习博客了,开学事情多,奇葩心思多嘛,谅解.现在在一家公司实习Salesforce开发,每天都在看英文文档,然后学着操作,只可惜没人能培训下,学习起来进度比较慢.英文的文档看的思绪 ...