POJ 3264 Balanced Lineup

来源:互联网 发布:小猪cms三网合一源码 编辑:程序博客网 时间:2024/05/17 23:32

题目链接

题目大意:求区间[A,B]最大最小值的差。

题解:

线段树,或者RMQ。

以下是线段树程序。

#include <cstdio>#include <iostream>using namespace std;#define Maxn 50005#define INF 100000000struct Node{    int l,r;    int tall,shor;}tr[Maxn << 2];int num[Maxn];int low,hei;void Build(int left,int right,int u){    tr[u].l = left;    tr[u].r = right;        if (tr[u].l == tr[u].r)    {        tr[u].tall = num[left];        tr[u].shor = num[left];        return ;    }    int mid = (tr[u].l+tr[u].r)/2;        Build(left,mid,2*u);    Build(mid+1,right,2*u+1);        tr[u].tall = max (tr[2*u].tall,tr[2*u+1].tall);    tr[u].shor = min (tr[2*u].shor,tr[2*u+1].shor);   }void query (int left,int right,int u){    if (tr[u].l == left&&tr[u].r == right)    {        low = min (low,tr[u].shor);        hei = max (hei,tr[u].tall);        return ;    }    int mid = (tr[u].l + tr[u].r)/2;    if (right <= mid)        query (left,right,2*u);    else if (left >= mid + 1)        query (left,right,2*u+1);    else    {        query(left,mid,2*u);        query (mid+1,right,2*u+1);    }}int main (){    int n,m,a,b;    scanf ("%d%d",&n,&m);        for (int i = 1;i <= n;i ++) scanf ("%d",&num[i]);        Build(1,n,1);        while (m--)    {        scanf ("%d%d",&a,&b);        low = INF;        hei = 0;        query (a,b,1);        printf ("%d\n",hei - low);    }        return 0;}


0 0
原创粉丝点击