点我看题目

题意 :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. Android之调试打印

  2. Atom编辑器入门到精通(六) Markdown支持

    尽管我们使用Atom主要是为了编写代码,不过Atom还支持编辑很多其他格式的文件. 比如Markdown和Asciidoc. 这一章中我们主要学习如何快速方便地编辑Markdown文件.另外在写这篇博 ...

  3. Linux find常见用法示例

    find命令的参数: pathname: find命令所查找的目录路径.例如用.来表示当前目录,用/来表示系统根目录.-print: find命令将匹配的文件输出到标准输出.-exec: find命令 ...

  4. sql 更新重复数据只取一条记录

    select s.*  from (     select *, row_number() over (partition by PersonnelAccount order BY Personnel ...

  5. 线程间通信--生产者消费者 升级版JDK5

    import java.util.concurrent.locks.*; /*1.新的解锁,上锁操作,据说是jdk5.0升级版,以前的枷锁,解锁都是隐藏的,默认的,现在变成显式 2.新的异常处理方式  ...

  6. Markdown編輯器

    MarkDown编辑器 一.什么是Markdown编辑器 二.怎么使用Markdown编辑器 1.标题/Head 2.超链接/Link/Reference ②自動的郵件連結也很類似,只是Markdow ...

  7. mysql学习笔记4

    用phpmyadmin创建数据库时出现 #1064 - You have an error in your SQL syntax; check the manual that corresponds ...

  8. 学习C++ Primer 的个人理解(六)

    第四章和第五章没什么特别的.基本上就是书本上的字面意思,也没什么需要注意的细节.直接记录第六章. 本章介绍了函数,其实也没什么特别的.但有几个重点 1.形参的类型决定了形参和实参的交互方式.形参是引用 ...

  9. DLL详解及Denpendcy Walker的使用

    下面的文章被N次转载,为了尊重原作,\(^o^)/~,贴出最早发布这篇文章的地址及作者.   动态链接库 Windows的活动大陆 2006-07-26 09:21  作者:狂ρκ来源:电脑爱好者 在 ...

  10. Java中的面向对象

    Java中的面向对象 在软件开发的学习中, 我最先接触的开发语言就是java,但都是简单的函数和循环数组的应用.说道面向对象,第一次看到这个词的时候还是在C#的学习过程中,我记得当时PPT上霸气的解释 ...