Lightoj1093 【线段树】

题意:
给出n个数,然后对于D区间的数求一个最大差值
思路:

区间最大最小。。。我居然没想到线段树。。。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e5+10;

struct SegT{
    int left;
    int right;
    int mid;
    int tmin,tmax;
};
SegT q[N*4];
int n;

void Build(int num,int L ,int R)
{
    int mid;
    q[num].left=L;
    q[num].right=R;
    mid=(L+R)/2;
    if(L==R)
    {
        scanf("%d",&q[num].tmax);
        q[num].tmin=q[num].tmax;
        return;
    }
    Build(2*num,L,mid);
    Build(2*num+1,mid+1,R);
    q[num].tmin=min(q[2*num].tmin,q[2*num+1].tmin);
    q[num].tmax=max(q[2*num].tmax,q[2*num+1].tmax);
}

int query_min(int num,int s, int t)
{
    if(q[num].left>=s&&q[num].right<=t)
        return q[num].tmin;
    int mid=(q[num].left+q[num].right)/2;
    if(mid>=t)
        return query_min(2*num,s,t);
    else if(mid<s)
        return query_min(2*num+1,s,t);
    else
        return min(query_min(2*num,s,mid),query_min(2*num+1,mid+1,t));
}

int query_max(int num,int s, int t)
{
    if(q[num].left>=s&&q[num].right<=t)
        return q[num].tmax;
    int mid=(q[num].left+q[num].right)/2;
    if(mid>=t)
        return query_max(2*num,s,t);
    else if(mid<s)
        return query_max(2*num+1,s,t);
    else
        return max(query_max(2*num,s,mid),query_max(2*num+1,mid+1,t));
}

int main()
{
    int T,cas=1,d;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&d);
        Build(1,1,n);
        int ans=0;
        for(int i=1;i<=(n-d+1);i++)
        {
            ans=max(ans,abs(query_max(1,i,i+d-1)-query_min(1,i,i+d-1)));
        }
        printf("Case %d: %d\n",cas++,ans);
    }
    return 0;
}


posted @ 2016-11-17 21:19  see_you_later  阅读(124)  评论(0编辑  收藏  举报