poj 3264 Balanced Lineup

来源:互联网 发布:as3 转 js 编辑:程序博客网 时间:2024/06/14 11:50

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


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


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


code:

#include<cstdio>#include<cmath>#include<algorithm>#include<iostream>#define Max 50010using 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;}


0 0
原创粉丝点击