kb-07-RMQ线段树--07(动态规划)
RMQ是一类解决区间最值查询的算法的通称;、一共有四类;在代码中有说明;
下面是ST算法,就是动态规划做法;
/*
RMQ算法、
RMQ是一个通称,专指区间求最值的算法;
分为:暴力,线段树,动态规划(ST),RMQ标准算法;四种
这一题用普通的线段树也是可以做的,维护区间最大值和区间最小值然后查询区间最值然后做差就行了;
这里用的是动态规划法就是ST;
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,q;
int a[]={},d[][]={},dd[][]={};
void RMQ_inti_min()
{
for(int i=;i<n;i++)
{
d[i][]=a[i];
}
for(int i=;(<<i)<=n;i++)//控制的是第二维;
{
for(int j=;j+(<<i)-<n;j++)
{
d[j][i]=min(d[j][i-],d[j+(<<(i-))][i-]);
}
}
}
void RMQ_inti_max()
{
for(int i=;i<n;i++)
{
dd[i][]=a[i];
}
for(int i=;(<<i)<=n;i++)//控制的是第二维;
{
for(int j=;j+(<<i)-<n;j++)
{
dd[j][i]=max(dd[j][i-],dd[j+(<<(i-))][i-]);
}
}
}
int RMQ_min(int l,int r)
{
int k=;
while((<<(k+))<=r-l+)
k++;
return min(d[l][k],d[r-(<<k)+][k]);
}
int RMQ_max(int l,int r)
{
int k=;
while((<<(k+))<=r-l+)
k++;
return max(dd[l][k],dd[r-(<<k)+][k]);
}
int main()
{
while(scanf("%d%d",&n,&q)!=EOF)
{
memset(a,,sizeof(a));
memset(d,,sizeof(d));
memset(dd,,sizeof(dd));
for(int i=;i<n;i++)
{
scanf("%d",&a[i]);
}
RMQ_inti_min();
RMQ_inti_max();
for(int i=;i<q;i++)
{
int l,r;
scanf("%d%d",&l,&r);
int max=RMQ_max(l-,r-);
int min=RMQ_min(l-,r-);
printf("%d\n",max-min);
}
}
return ;
}
kb-07-RMQ线段树--07(动态规划)的更多相关文章
- NBU 2475 Survivors(RMQ线段树)
NBU 2475Survivors 题目链接:http://acm.nbu.edu.cn/v1.0/Problems/Problem.php?pid=2475 题意:给定n个人,每个人有strengt ...
- 【agc023E】Inversions(线段树,动态规划)
[agc023E]Inversions(线段树,动态规划) 题面 AT 给定\(a_i\),求所有满足\(p_i\le a_i\)的排列\(p\)的逆序对数之和. 题解 首先如何计算排列\(p\)的个 ...
- ACM学习历程—HDU5696 区间的价值(分治 && RMQ && 线段树 && 动态规划)
http://acm.hdu.edu.cn/showproblem.php?pid=5696 这是这次百度之星初赛2B的第一题,但是由于正好打省赛,于是便错过了.加上2A的时候差了一题,当时有思路,但 ...
- UESTC 764 失落的圣诞节 --RMQ/线段树
题意:n种物品,每种物品对不同的人都有不同的价值,有三个人选,第一个为普通学生,第二个是集,第三个是祈,集和祈可以选一样的,并且还会获得加分,集和祈选的普通学生都不能选,问三个人怎样选才能使总分最高. ...
- [RMQ] [线段树] POJ 3368 Frequent Values
一句话,多次查询区间的众数的次数 注意多组数据!!!! RMQ方法: 预处理 i 及其之前相同的数的个数 再倒着预处理出 i 到不是与 a[i] 相等的位置之前的一个位置, 查询时分成相同的一段和不同 ...
- VJ16216/RMQ/线段树单点更新
题目链接 /* 单点更新,用RMQ维护最大值,add对c[i]修改,或加,或减. 求[l,r]的和,用sum(r)-sum(l-1).即可. */ #include<cmath> #inc ...
- 51Nod.1766.树上最远点对(树的直径 RMQ 线段树/ST表)
题目链接 \(Description\) 给定一棵树.每次询问给定\(a\sim b,c\sim d\)两个下标区间,从这两个区间中各取一个点,使得这两个点距离最远.输出最远距离. \(n,q\leq ...
- lca 欧拉序+rmq(st) 欧拉序+rmq(线段树) 离线dfs 倍增
https://www.luogu.org/problemnew/show/P3379 1.欧拉序+rmq(st) /* 在这里,对于一个数,选择最左边的 选择任意一个都可以,[left_index, ...
- poj2763(lca / RMQ + 线段树)
题目链接: http://poj.org/problem?id=2763 题意: 第一行输入 n, q, s 分别为树的顶点个数, 询问/修改个数, 初始位置. 接下来 n - 1 行形如 x, y, ...
随机推荐
- 如果不需要,建议移除net standard类库中的Microsoft.NETCore.Portable.Compatibility
使用Microsoft.NETCore.Portable.Compatibility会破坏该类库在Mono和Xamarin平台的兼容性 可能导致的问题 provides a compile-time ...
- BCB:Windows消息处理
Windows消息处理 BCB 本文研究了BCB中的消息处理机制,在此基础上提出了处理Windows消息和自定义消息响应的方法和建立动态和静态消息映射的技巧. C++ Builder作为一种RAD方式 ...
- C++中malloc / free 和 new / delete 的区别?
1.malloc/free 是C++/C语言的标准库函数,New/delete是C++运算符:都是用于申请动态内存和释放内存. 2.new做两件事:分配内存和调用类的构造函数,delete是:调用类的 ...
- 解决在matplotlib使用中文的问题
原生的matplotlib并不支持直接使用中文,而需要修改一下相应的文件,上网搜了下,找到一个最简洁的办法. NO.1 找到matplotlibrc文件 C:\Python26\Lib\site-pa ...
- 消息队列之 Kafka
转 https://www.jianshu.com/p/2c4caed49343 消息队列之 Kafka 预流 2018.01.15 16:27* 字数 3533 阅读 1114评论 0喜欢 12 K ...
- 关于PHP连接池扩展php-cp遇到的那些坑
php-cp是国内大神写的php第三方扩展,具体就不用多说了,细读https://github.com/swoole/php-cp,下面来说说今天安装方法. 环境:CentOS7.2.1511 由于本 ...
- ccf 201803-1 跳一跳(Python实现)
一.原题 问题描述 试题编号: 201803-1 试题名称: 跳一跳 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 近来,跳一跳这款小游戏风靡全国,受到不少玩家的喜爱. 简化 ...
- 【mysql】mysql 备份脚本
#! /bin/bash HOST=localhost USER=root PASSWORD=password DATE_STR=$(date '+%F--%T') ERROR_LOG=/usr/ ...
- Python PyAudio 安装使用
Python PyAudio安装: Python3.7 无法安装pyaudio pip install pyaudio提示error: Microsoft Visual C++ 14.0 is req ...
- spring+struts2+mybatis框架依赖pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...