POJ 3264.Balanced Lineup-RMQ(ST)详解
先写一道水题的博客,为后面要写的博客做一个铺垫。
ヾ(◍°∇°◍)ノ゙
RMQ(Range Minimum/Maximum Query),即区间最值查询,对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间的最小/大值。
时间复杂度:
传送门:一篇写的容易理解的博客 2/21/2018 5:12:00 PM
-------------------------------------------------------分割线-----------------------------------------------------------
2/22/2018 10:27:00 PM
本来不想写详细一些,但是我发现其他的博客写的我越看越乱,实在是受不了了。
当然我自己写的也乱七八糟,但是我自己能看懂啊。
这里说dp思想的(ST),RMQ就是利用二进制倍增的思想,对数据进行最值比较。关于倍增的思想,传送门:小白兔
该算法通过将数据进行类似二分的操作,将数据进行比较。说的乱七八糟,不如直接解释样例来的实际。
先贴代码:
void ST(){
for(int i=;i<=n;i++)
mm[i][]=mi[i][]=a[i];
for(int j=;(<<j)<=n;j++){
for(int i=;i+(<<j)-<=n;i++){
mm[i][j]=max(mm[i][j-],mm[i+(<<(j-))][j-]);
mi[i][j]=min(mi[i][j-],mi[i+(<<(j-))][j-]);
}
}
}
还是用其他题解的样例,我用这个推的。
样例3 2 4 5 6 8 1 2 9 7
首先应该知道1<<n是什么东西,位运算,就是左移位,想一下什么时候二进制的能向左移一位,当然是进位了,怎么才能进位啊,就是乘个2才能进位啊。
就是这个意思,1<<0是1,我智障,一开始当成2,我说怎么越推越不对。。。(T▽T)
开始咸鱼行动(只推一部分,讲道理,自己手推一遍就能明白,手推一遍还不懂的,就真的是过分了,就比我还智障了,我是最智障的)
一开始的时候就是比较自己,不管最大还是最小肯定都是自己,mm[1][0]=3,mm[2][0]=2,mm[3][0]=4。。。所以直接进行下一步。只推求最大值的(最小值也一样)
mm[1][1]=max(mm[1][0],mm[1+(1<<0)][0])=max([1][0],mm[1+1][0])=max([1][0],mm[2][0])==>max(3,2)=3;
mm[2][1]=max(mm[2][0],mm[2+(1<<0)][0])=max([2][0],mm[2+1][0])=max([2][0],mm[3][0])==>max(2,4)=4;
mm[3][1]=max(mm[3][0],mm[3+(1<<0)][0])=max([3][0],mm[3+1][0])=max([3][0],mm[4][0])==>max(4,5)=5;
。
。
。
mm[1][2]=max(mm[1][1],mm[1+2][1])=max(mm[1][1],mm[3][1])==>max(3,2,4,5)=5;
mm[2][2]=max(mm[2][1],mm[2+2][1])=max(mm[2][1],mm[4][1])==>max(2,4,5,6)=6;
max(4,5,6,8)=8;
max(5,6,8,1)=8;
max(6,8,1,2)=8;
。
。
。
接下来的mm[1][3]之类的也是这种操作,其实就是比较8个数的最值了(并不是真的比较8个数,而是通过前面假装比较4个数的得出来的,都是动态规划直接用上一个状态的数据得出来的)中间重复的一部分就直接省略过去了,这里就会省很多时间,这就是算法的美丽所在啊,所有能节省时间的算法都是无敌的。
这个操作是神操作,就是通过这种操作进行倍增的比较,也是动态规划美丽的地方(。◕ᴗ◕。)(仔细看看橙色的地方就懂了)。
将中间重复的2和4的比较就省略过去了(因为没必要),自己多推几个就明白了(懒是没用的),不能只会用,还要知道为什么这个可以这样用。
就酱,满足~ing
接下来是怎么找区间的最值呢?这里就好理解了。就是将要比较的区间分成两部分,通过状态转移就得出来。首先先算一下最多能2的多少次方满足区间长度,然后按这个长度将区间分开。
还是那个例子 3 2 4 5 6 8 1 2 9 7
假设我要找区间1--6的最大值,首先先算一下,1<<2就是2的平方=4的长度不会超过6-1+1=5,1<<3就是8了,不可以。所以就是找从第一个数开始的前4个数的最值和从6开始的倒着数4个数的最值的比较。
(本质上还是dp的思想,状态转移)就是max(3,2,4,5)和max(4,5,6,8)的比较。
解释的这么详细了,应该可以了。我要喊翠花了。
开始上菜。
Time Limit: 5000MS | Memory Limit: 65536K | |
Total Submissions: 58952 | Accepted: 27598 | |
Case Time Limit: 2000MS |
Description
For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same order. One day Farmer John decides to organize a game of Ultimate Frisbee with some of the cows. To keep things simple, he will take a contiguous range of cows from the milking lineup to play the game. However, for all the cows to have fun they should not differ too much in height.
Farmer John has made a list of Q (1 ≤ Q ≤ 200,000) potential groups of cows and their heights (1 ≤ height ≤ 1,000,000). For each group, he wants your help to determine the difference in height between the shortest and the tallest cow in the group.
Input
Lines 2..N+1: Line i+1 contains a single integer that is the height of cow i
Lines N+2..N+Q+1: Two integers A and B (1 ≤ A ≤ B ≤ N), representing the range of cows from A to B inclusive.
Output
Sample Input
6 3
1
7
3
4
2
5
1 5
4 6
2 2
Sample Output
6
3
0
Source
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=*+;
const int maxm=;
int a[maxn],mm[maxn][maxm],mi[maxn][maxm];
int n,m;
void ST(){
for(int i=;i<=n;i++)
mm[i][]=mi[i][]=a[i];
for(int j=;(<<j)<=n;j++){
for(int i=;i+(<<j)-<=n;i++){
mm[i][j]=max(mm[i][j-],mm[i+(<<(j-))][j-]);
mi[i][j]=min(mi[i][j-],mi[i+(<<(j-))][j-]);
}
}
}
int RMQ(int l,int r){
int k=;
while((<<(k+))<=r-l+)k++;
int ans1=max(mm[l][k],mm[r-(<<k)+][k]);
int ans2=min(mi[l][k],mi[r-(<<k)+][k]);
return ans1-ans2;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
ST();
while(m--){
int l,r;
scanf("%d%d",&l,&r);
printf("%d\n",RMQ(l,r));
}
return ;
}
OK啦,溜了,进行下一步。
Go,进击吧,看我咸鱼突刺!!!(〃'▽'〃)
POJ 3264.Balanced Lineup-RMQ(ST)详解的更多相关文章
- POJ 3264 Balanced Lineup RMQ ST算法
题意:有n头牛,编号从1到n,每头牛的身高已知.现有q次询问,每次询问给出a,b两个数.要求给出编号在a与b之间牛身高的最大值与最小值之差. 思路:标准的RMQ问题. RMQ问题是求给定区间内的最值问 ...
- Poj 3264 Balanced Lineup RMQ模板
题目链接: Poj 3264 Balanced Lineup 题目描述: 给出一个n个数的序列,有q个查询,每次查询区间[l, r]内的最大值与最小值的绝对值. 解题思路: 很模板的RMQ模板题,在这 ...
- POJ 3264 Balanced Lineup 【ST表 静态RMQ】
传送门:http://poj.org/problem?id=3264 Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total S ...
- poj 3264 Balanced Lineup (RMQ)
/******************************************************* 题目: Balanced Lineup(poj 3264) 链接: http://po ...
- POJ - 3264 Balanced Lineup (RMQ问题求区间最值)
RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,也就 ...
- poj 3264 Balanced Lineup (RMQ算法 模板题)
RMQ支持操作: Query(L, R): 计算Min{a[L],a[L+1], a[R]}. 预处理时间是O(nlogn), 查询只需 O(1). RMQ问题 用于求给定区间内的最大值/最小值问题 ...
- POJ 3264 Balanced Lineup(ST模板)
链接:http://poj.org/problem?id=3264 题意:给n个数,求一段区间L,R的最大值 - 最小值,Q次询问 思路:ST表模板,预处理区间最值,O(1)复杂度询问 AC代码: # ...
- POJ 3264 Balanced Lineup -- RMQ或线段树
一段区间的最值问题,用线段树或RMQ皆可.两种代码都贴上:又是空间换时间.. RMQ 解法:(8168KB 1625ms) #include <iostream> #include < ...
- poj 3264 Balanced Lineup(RMQ裸题)
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 43168 Accepted: 20276 ...
- POJ 3264 Balanced Lineup(RMQ)
点我看题目 题意 :N头奶牛,Q次询问,然后给你每一头奶牛的身高,每一次询问都给你两个数,x y,代表着从x位置上的奶牛到y位置上的奶牛身高最高的和最矮的相差多少. 思路 : 刚好符合RMQ的那个求区 ...
随机推荐
- 23、php知识点总结基础教程--part-1
1.基本语法 PHP 脚本可放置于文档中的任何位置. PHP 脚本以 <?php 开头,以 ?> 结尾 <?php // 此处是 PHP 代码 ?> PHP 文件的默认文件扩展 ...
- Python全栈工程师 (类变量、方法、继承、覆盖)
ParisGabriel 每天坚持手写 一天一篇 决定坚持几年 为了梦想为了信仰 开局一张图 Python人工智能从入门到精通 补充: 实例方法都是操作实例对象 ...
- OZ常见错误解决办法
执行成功 错误信息解决办法 libvirt.libvirtError: Failed to connect socket to '/var/run/libvirt/libvirt-sock': No ...
- 洛谷P1003铺地毯(提高组)
题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n. 现在将这些地毯按照编号从小到大的顺序平行于 ...
- codeforces Registration system
Registration system A new e-mail service "Berlandesk" is going to be opened in Berland in ...
- hdu 1203 01背包 I need a offer
hdu 1203 01背包 I need a offer 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1203 题目大意:给你每个学校得到offe ...
- vmware设置静态ip(复制)
一.安装好虚拟后在菜单栏选择编辑→ 虚拟网络编辑器,打开虚拟网络编辑器对话框,选择Vmnet8 Net网络连接方式,随意设置子网IP,点击NAT设置页面,查看子网掩码和网关,后面修改静态IP会用到. ...
- ASP.NET Core MVC 运行所选代码生成器时出错
添加Nuget Microsoft.VisualStudio.Web.CodeGeneration.Design Microsoft.EntityFrameworkCore.Tools
- java实现远程开机
import java.io.IOException; import java.net.*;public class 远程开机 { public static void main(String[] a ...
- asp+access win2008php+mysql /dedecms 配置总结
1. IIS 应用池 高级设置 启用32位应用程序:True 2. c盘window/Temp user 应该有管理权限 如果不行 creator owner 给予修改权限 ...