点我看题目

题意 :N头奶牛,Q次询问,然后给你每一头奶牛的身高,每一次询问都给你两个数,x y,代表着从x位置上的奶牛到y位置上的奶牛身高最高的和最矮的相差多少。

思路 : 刚好符合RMQ的那个求区间最大最小值,所以用RMQ还是很方便的。就是一个RMQ的模板题,基本上书上网上都有。

RMQ基础知识

RMQ算法举例

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <iostream> const int maxn = ;
int maxsum[maxn][],minsum[maxn][] ;
int a[maxn] ;
int N,Q ; using namespace std ; void Init()
{
for(int i = ; i <= N ; i++)
{
scanf("%d",&a[i]) ;
maxsum[i][] = a[i] ;
minsum[i][] = a[i] ;
}
} void RMQ()
{
int k = (int )(log((double)N)/log(2.0)) ;
for(int j = ; j <= k ; j++)
for(int i = ; i <= N ; i++)
if(i + ( << j) - <= N )
{
maxsum[i][j] = max(maxsum[i][j-],maxsum[i + ( << (j-))][j-]) ;
minsum[i][j] = min(minsum[i][j-],minsum[i + ( << (j-))][j-]) ;
}
}
int main()
{
while(~scanf("%d %d",&N,&Q))
{
Init() ;
RMQ() ;
int x,y ;
for(int i = ; i <= Q ; i++)
{
scanf("%d %d",&x,&y) ;
int k = (int)(log((double)(y-x+))/log(2.0)) ;
int minn = min(minsum[x][k],minsum[y-(<<k)+][k]) ;
int maxx = max(maxsum[x][k],maxsum[y-(<<k)+][k]) ;
printf("%d\n",maxx-minn) ;
}
}
return ;
}

线段树写法 :

 //POJ 3264
#include <cstdio>
#include <cstring>
#include <iostream> using namespace std ; //int maxx,minn ;
int p[ * ],q[ * ]; void pushup(int rt)
{
p[rt] = max(p[rt << ],p[rt << | ]) ;
q[rt] = min(q[rt << ],q[rt << | ]) ;
}
void build(int l,int r,int rt)
{
int a ;
if(l == r)
{
scanf("%d",&a) ;
p[rt] = a ;
q[rt] = a ;
return ;
}
int mid = (l+r) >> ;
build(l,mid,rt << ) ;
build(mid+,r,rt << | ) ;
pushup(rt) ;
}
int query(int L,int R,int l,int r,int rt)
{
int maxx = - ;
if(l >= L && r <= R)
{
return p[rt] ;
}
int mid = (l+r) >> ;
if(mid >= L)
maxx = max(maxx,query(L,R,l,mid,rt << ) ) ;
if(mid < R)
maxx = max(maxx,query(L,R,mid+,r,rt << | )) ;
return maxx ;
}
int querz(int L,int R,int l,int r,int rt)
{
int minn = ;
if(l >= L && r <= R)
{
return q[rt] ;
}
int mid = (l+r) >> ;
if(mid >= L)
minn = min(minn,querz(L,R,l,mid,rt << ) ) ;
if(mid < R)
minn = min(minn,querz(L,R,mid+,r,rt << | ) );
return minn ;
}
int main()
{
int N,M ;
while(~scanf("%d %d",&N,&M))
{
build(,N,) ;
int a,b ;
for(int i = ; i < M ; i++)
{
scanf("%d %d",&a,&b) ;
// printf("%d %d*\n",query(a,b,1,N,1),querz(a,b,1,N,1)) ;
printf("%d\n",query(a,b,,N,) - querz(a,b,,N,) ) ;
}
}
return ;
}

POJ 3264 Balanced Lineup(RMQ)的更多相关文章

  1. poj 3264 Balanced Lineup(RMQ裸题)

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 43168   Accepted: 20276 ...

  2. POJ 题目3264 Balanced Lineup(RMQ)

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 39046   Accepted: 18291 ...

  3. POJ 3264 Balanced Lineup(RMQ_ST)

    题目链接:http://poj.org/problem? id=3264 Description For the daily milking, Farmer John's N cows (1 ≤ N  ...

  4. poj 3264:Balanced Lineup(线段树,经典题)

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 32820   Accepted: 15447 ...

  5. POJ - 3264——Balanced Lineup(入门线段树)

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 68466   Accepted: 31752 ...

  6. POJ 3264 Balanced Lineup(ST模板)

    链接:http://poj.org/problem?id=3264 题意:给n个数,求一段区间L,R的最大值 - 最小值,Q次询问 思路:ST表模板,预处理区间最值,O(1)复杂度询问 AC代码: # ...

  7. poj 3264 Balanced Lineup (线段树)

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 42489   Accepted: 20000 ...

  8. Balanced Lineup(RMQ)

    原题传送门 就是裸RMQ啊.. 求区间最大值和区间最小值,一看就像RMQ,当然线段树貌似也可以. 至于算法嘛.自己学~(好吧,放个传送门...) 然后就是最后把maxsum-minsum就好啦233~ ...

  9. POJ 3264 Balanced Lineup (线段树)

    Balanced Lineup For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the s ...

随机推荐

  1. dos下循环复制一张图片的bat

    @echo off setlocal enabledelayedexpansion ,,) do ( @echo !dm! copy .png !dm!.png ) 我期待的结果是将140041.pn ...

  2. JavaScript知识点回顾

    一  浏览器对象树   window:处于对象树中的最高层,表示一个浏览器窗口,由于唯一,可以省略不写.(window.document 等价 document) Forms.Images.Links ...

  3. dede常用命令

    获取日期:全局:{dede:field.pubdate function="MyDate('Y-m-d H:i',@me)"/}   局部:[field:pubdate funct ...

  4. 页面动态加载js文件

    function loadJS(url, onload) { var domscript = document.createElement('script'); domscript.src = url ...

  5. Ubuntu将程序图标加到启动器

    问题: Ubuntu中安装一些程序的时候图标可能没有放到启动器中,不方便使用. 解决问题: 因为FileZilla这个程序是直接解压缩之后便可以使用的,每次都需要到文件所在目录Filezilla/bi ...

  6. Android系统简介(中):系统架构

    Android的系统架构栈分为4层,从上往下分别是Applications.Application framework.Libraries  & Android Runtime.Linux  ...

  7. SQL SERVER 级联删除

    有三个表: Company Address Contact 在Address和Contact中建立外键,外键id为company的id, 那么就不能任意删除Company.但假如在外键约束中把级联删除 ...

  8. Java实战之02Hibernate-02映射、一级缓存、实体对象状态

    五.映射基础 1.实体类采用javabean的编写规范 JavaBean编写规范: a.类一般是public的 b.有默认的构造方法 c.字段都是私有的 d.提供公有的getter和setter方法 ...

  9. HDU 4762 Cut the Cake

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4762 题目大意:将n个草莓随机放在蛋糕上,草莓被看做是点,然后将蛋糕平均切成m份,求所有草莓在同一块蛋 ...

  10. 比之前那个版本更简单的C语言实现的比较大小

    之前那个是输入一堆数据,找最大那个,这次是更简单的版本,求两个数的最大值. #include "stdafx.h" #include <stdio.h> int Get ...