码迷,mamicode.com
首页 > 其他好文 > 详细

POJ3264Balanced Lineup 线段树练手

时间:2015-08-28 00:24:07      阅读:278      评论:0      收藏:0      [点我收藏+]

标签:

题目意思:给定Q(1<=Q<=200000)个数A1,A2,```,AQ,
多次求任一区间Ai-Aj中最大数和最小数的差

//1085422276
#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <string>
#include <stack>
#include <math.h>
#include <vector>
#include <string.h>
using namespace std;

typedef __int64 ll;
const int inf = (int)1E9+10;
inline ll read()
{
    ll x=0,f=1;char ch=getchar();
    while(ch<0||ch>9){if(ch==-)f=-1;ch=getchar();}
    while(ch>=0&&ch<=9){x=x*10+ch-0;ch=getchar();}
    return x*f;
}

//*******************************
struct ss
{
    int l,r,mn,ma;
}tr[800001];
int n,q,a[200001],nn,mm;
void build(int k,int s,int t)
{
    tr[k].l=s;
    tr[k].r=t;
    if(s==t){
        tr[k].mn=tr[k].ma=a[s];
        return ;
    }
    int mid=(s+t)>>1;
    build(k<<1,s,mid);
    build(k<<1|1,mid+1,t);
    tr[k].ma=max(tr[k<<1].ma,tr[k<<1|1].ma);
    tr[k].mn=min(tr[k<<1].mn,tr[k<<1|1].mn);
}
void ask(int k,int s,int t)
{
    if(tr[k].ma<=nn&&tr[k].mn>=mm)return;
    if(s==tr[k].l&&t==tr[k].r)
    {
        nn=max(tr[k].ma,nn);
        mm=min(tr[k].mn,mm);
        return;
    }
    int mid=(tr[k].l+tr[k].r)>>1;
    if(t<=mid) ask(k<<1,s,t);
    else if(s>mid) ask(k<<1|1,s,t);
    else {
       ask(k<<1,s,mid);
       ask(k<<1|1,mid+1,t);
    }
}

int main()
{

    while(scanf("%d%d",&n,&q)!=EOF)
    {
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
        }build(1,1,n);int x,y;
        for(int i=1;i<=q;i++){
                nn=-inf;
               mm=inf;
            scanf("%d%d",&x,&y);
            ask(1,x,y);
            printf("%d\n",nn-mm);
        }
    }
    return 0;
}

 

POJ3264Balanced Lineup 线段树练手

标签:

原文地址:http://www.cnblogs.com/zxhl/p/4764877.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!