首页 > 代码库 > poj 3264 Balanced Lineup

poj 3264 Balanced Lineup

题目链接:http://poj.org/problem?id=3264


题目大意:就是给你一串数,问你最大数和最小数的差值。。。。。。。


思路:最基本的线段树,只需要建树和查询,修改都省啦,但是查询要写两个,一个查询最大值,一个查询最小值。。。。。。然后就能AC掉。。。。。但是话说poj把它分类到RMQ中。。。。


code:

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<iostream>
#define Max 50010
using namespace std;

struct Node
{
    int l,r;
    int minn,maxx;
}node[Max*4];

int num[Max];

void BuildTree(int i,int l,int r)
{
    node[i].l=l;
    node[i].r=r;
    if(l==r)
    {
        node[i].maxx=node[i].minn=num[l];
        return ;
    }
    int mid=(l+r)/2;
    BuildTree(i*2,l,mid);
    BuildTree(i*2+1,mid+1,r);
    node[i].maxx=max(node[i*2].maxx,node[i*2+1].maxx);
    node[i].minn=min(node[i*2].minn,node[i*2+1].minn);
}

int  Query(int i,int l,int r)       //查询最大值
{
    if(node[i].l==l&&node[i].r==r)
    {
        return node[i].maxx;
    }
    int mid=(node[i].l+node[i].r)/2;
    if(r<=mid) return Query(i*2,l,r);
    else if(l>mid) return Query(i*2+1,l,r);
    else
    {
        return max(Query(i*2,l,mid),Query(i*2+1,mid+1,r));
    }
}

int Query1(int i,int l,int r)     //查询最小值
{
    if(node[i].l==l&&node[i].r==r)
    {
        return node[i].minn;
    }
    int mid=(node[i].l+node[i].r)/2;
    if(r<=mid) return Query1(i*2,l,r);
    else if(l>mid) return Query1(i*2+1,l,r);
    else
    {
        return (min(Query1(i*2,l,mid),Query1(i*2+1,mid+1,r)));
    }
}

int main()
{
    int n,q;
    while(scanf("%d%d",&n,&q)==2)
    {
        int i;
        for(i=1;i<=n;i++)
        {
            scanf("%d",&num[i]);
        }
        BuildTree(1,1,n);
        for(i=1;i<=q;i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            int m1=Query(1,a,b);
            int m2=Query1(1,a,b);
            printf("%d\n",m1-m2);
        }
    }
    return 0;
}