TOJ 2762.Balanced Lineup

转载 2016年08月29日 22:50:30

题目链接:http://acm.tju.edu.cn/toj/showp2762.html


2762.   Balanced Lineup
Time Limit: 5.0 Seconds   Memory Limit: 65536K
Total Runs: 1458   Accepted Runs: 544    Multiple test files



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 ≤ 180,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.

Note: on the largest test case, I/O takes up the majority of the runtime.

Input

* Line 1 : Two space-separated integers, N and Q.

* 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

* Lines 1 .. Q : Each line contains a single integer that is an answer to an input query and tells the difference in height between the tallest and shortest cow in the input range.

Sample Input

6 3
1
7
3
4
2
5
1 5
4 6
2 2

Sample Output

6
3
0


Source: USACO 2007 January Competition
Submit   List    Runs   Forum   Statistics



作者:kuangbin(转载请注明出处,谢谢!!)

更多详细文章,请访问博客:www.cnblogs.com/kuangbin

 

ACM POJ 3264 Balanced Lineup

这到题目是线段树的练习题目。

很简单,练练手!!

AC程序:

复制代码
/*
POJ 3264  Balanced Lineup
题目意思:给定Q(1<=Q<=200000)个数A1,A2,```,AQ,
多次求任一区间Ai-Aj中最大数和最小数的差 
*/
#include<stdio.h>
#include<algorithm>
#include<iostream>
using namespace std;
#define MAXN 200005
#define INF 10000000
int nMax,nMin;//记录最大最小值 
struct Node
{
    int l,r;//区间的左右端点 
    int nMin,nMax;//区间的最小值和最大值 
}segTree[MAXN*3];
int a[MAXN];
void Build(int i,int l,int r)//在结点i上建立区间为(l,r)
{
    segTree[i].l=l;
    segTree[i].r=r;
    if(l==r)//叶子结点 
    {
        segTree[i].nMin=segTree[i].nMax=a[l];
        return;
    } 
    int mid=(l+r)>>1;
    Build(i<<1,l,mid);
    Build(i<<1|1,mid+1,r);
    segTree[i].nMin=min(segTree[i<<1].nMin,segTree[i<<1|1].nMin);
    segTree[i].nMax=max(segTree[i<<1].nMax,segTree[i<<1|1].nMax);   
}
void Query(int i,int l,int r)//查询结点i上l-r的最大值和最小值
{
    if(segTree[i].nMax<=nMax&&segTree[i].nMin>=nMin)  return;
    if(segTree[i].l==l&&segTree[i].r==r)
    {
        nMax=max(segTree[i].nMax,nMax);
        nMin=min(segTree[i].nMin,nMin);
        return;
    }
    int mid=(segTree[i].l+segTree[i].r)>>1;
    if(r<=mid)   Query(i<<1,l,r);
    else if(l>mid)  Query(i<<1|1,l,r);
    else
    {
        Query(i<<1,l,mid);
        Query(i<<1|1,mid+1,r);
    }      
}
int main()
{
    int n,q;
    int l,r;
    int i;
    while(scanf("%d%d",&n,&q)!=EOF)
    {
        for(i=1;i<=n;i++)
          scanf("%d",&a[i]);
        Build(1,1,n);
        for(i=1;i<=q;i++)
        {
            scanf("%d%d",&l,&r);
            nMax=-INF;nMin=INF;
            Query(1,l,r);
            printf("%d\n",nMax-nMin);
        }    
    }  
    return 0;  
} 
复制代码

另外附一参考程序:

复制代码
#include <iostream>
#include <algorithm>
#include <numeric>
using namespace std;
#define MY_MIN  99999999
#define MY_MAX  -99999999


struct CNode
{
    int L,R;
    int nMin,nMax;
    CNode * pLeft, * pRight;
};
int nMax, nMin;
CNode Tree[1000000];
//CNode Tree[20];
int nCount = 0;
void BuildTree(CNode * pRoot, int L,int R)
{
    pRoot->L = L;
    pRoot->R = R;
    
    pRoot->nMin = MY_MIN;
    pRoot->nMax = MY_MAX;

    if ( L != R) {
        nCount ++;
        pRoot->pLeft = Tree + nCount;
        nCount ++;
        pRoot->pRight = Tree + nCount;
        BuildTree( pRoot->pLeft, L, ( L + R )/2);
        BuildTree( pRoot->pRight, (L + R) / 2 + 1,R);
    }
}
void Insert( CNode * pRoot , int i,int v)
{
    if( pRoot->L == i &&  pRoot->R == i ) {
        pRoot->nMin = pRoot->nMax = v;
        return;
    }
    pRoot->nMin = _cpp_min(pRoot->nMin,v);
    pRoot->nMax = _cpp_max(pRoot->nMax,v);
    if( i <= (pRoot->L + pRoot->R )/2 )
        Insert( pRoot->pLeft,i,v);
    else
        Insert( pRoot->pRight,i,v);
}
void Query(CNode * pRoot, int s, int e)
{
    if( pRoot->nMin >= nMin && pRoot->nMax <= nMax )
        return;
    if( s == pRoot->L && e == pRoot->R) {
        nMin = _cpp_min(pRoot->nMin,nMin);
        nMax = _cpp_max(pRoot->nMax,nMax);
        return ;
    }
    if( e <=  (pRoot->L + pRoot->R) / 2 )
        Query(pRoot->pLeft, s,e);
    else if( s >= (pRoot->L + pRoot->R) / 2 + 1)
        Query(pRoot->pRight, s,e);
    else {
        Query(pRoot->pLeft, s,(pRoot->L + pRoot->R) / 2);
        Query(pRoot->pRight, (pRoot->L + pRoot->R) / 2 + 1 ,e);
    }
}
int main()
{
    int n,q,h;
    int i,j,k;
    scanf("%d%d",&n,&q);
    nCount = 0;
    BuildTree(Tree,1,n);    
    for( i = 1;i <= n;i ++ ) {
        scanf("%d",&h);
        Insert( Tree,i,h);
    }
    for( i = 0;i < q;i ++ ) {
        int s,e;
        scanf("%d%d", &s,&e);
        nMax = MY_MAX;
        nMin = MY_MIN;
        Query(Tree,s,e);
        printf("%d\n",nMax - nMin);
    }
    return 0;
}

POJ3274-Gold Balanced Lineup

  • 2011年07月31日 00:07
  • 90KB
  • 下载

POJ 3264 Balanced Lineup (区间最值 RMQ模板/线段树)

题目地址:点击打开链接 区间最值查询,RMQ和线段树都可以。 RMQ代码: #include #include #include #include using namespace std; c...
  • CillyB
  • CillyB
  • 2017年03月15日 23:29
  • 159

CUGB专题训练之数据结构:A - Balanced Lineup(线段树单点或RMQ)

RMQ直接套算法经典入门里的模板就行了,但是线段树因为好久不做了,所以今晚自己写了两个小时,才搞定……哈哈……不过太开心了,终于自己不用看模板也能写出来了,那个建树和插入函数都比较容易,但是在查询的时...

Balanced Lineup(线段树)

A - Balanced Lineup Time Limit:5000MS    Memory Limit:65536KB    64bit IO Format:%I64d & %I64u Sub...

POJ 3264 Balanced Lineup 线段树入门(点的查找)

这道题的意思是:给你n个点,每个数出现的位置对应着改点数的大小。然后给出m个区间输出每个区间上的最大值与最小值的差。 典型的线段树啊,自己写的那个代码很搓,然后啸爷教了我,他怎么写的,就学习了一下。...

poj 3264 Balanced Lineup(RMQ求区间最值)

Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 29631   Accepted:...
  • WEYuLi
  • WEYuLi
  • 2013年09月27日 14:11
  • 502

POJ 3264 Balanced Lineup 【线段树】

Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 50004 Accep...

poj 3264 Balanced Lineup

线段树水题,寻找区间最大最小值。只要建树还有查询操作就好了,更新没必要写。。#include #include #include #include #include #include #i...

Poj 3264 Balanced Lineup

题目大意:有一排牛,给定每头牛的高度,然后有一系列的询问,即给出i,j,要求输出第i个牛和第j个牛之间的最高的牛和最矮的牛之间高度差值。 思路:典型的区间最值查询,获取最大值和最小值后相减即可。 ...

POJ 3274 Gold Balanced Lineup (前缀和 + 哈希表)

POJ 3274 Gold Balanced Lineup (前缀和 + 哈希表)
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:TOJ 2762.Balanced Lineup
举报原因:
原因补充:

(最多只允许输入30个字)