poj 3264 Balanced Lineup (线段树模板题)

来源:互联网 发布:linux vi强制保存 编辑:程序博客网 时间:2024/05/18 16:40
Balanced Lineup
Time Limit: 5000MS Memory Limit: 65536KTotal Submissions: 40175 Accepted: 18865Case Time Limit: 2000MS

Description

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

Input

Line 1: Two space-separated integers, N andQ.
Lines 2..N+1: Line i+1 contains a single integer that is the height of cowi
Lines N+2..N+Q+1: Two integers A and B (1 ≤ABN), representing the range of cows from A toB inclusive.

Output

Lines 1..Q: Each line contains a single integer that is a response to a reply and indicates the difference in height between the tallest and shortest cow in the range.

Sample Input

6 31734251 54 62 2

Sample Output

630我的第一道线段树的题目,这道题也用RMQ解过,here 照着下面的代码学习了一下,原链接 点击打开链接
/*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 10000000int 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;  }


0 0
原创粉丝点击