HDU5443 线段树基础题 xingxing在努力

  算是线段树的基础入门题吧

  直接贴代码, 哎, 同学不理解真够醉的, 不是说这题啊。。

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
const int maxn = 1000 + 10;
int n;
int a[maxn];

struct segment
{
    int l, r;
    int x;            //l-r区间内的最大值
}seg[3*maxn];

void build(int rt, int l, int r)
{
    seg[rt].l = l;
    seg[rt].r = r;
    if(l == r)
    {
        seg[rt].x = a[l];
        return ;
    }
    int chl = 2*rt, chr = 2*rt+1;
    build(chl, l, (l+r)/2);
    build(chr, (l+r)/2+1, r);
    seg[rt].x = max(seg[chl].x, seg[chr].x);
}

int query(int rt, int l, int r)
{
    if(seg[rt].l==l && seg[rt].r==r)
    {
        return seg[rt].x;
    }
    int mid = (seg[rt].l+seg[rt].r)/2;
    if(r <= mid)
        return query(2*rt, l, r);
    else if(l > mid)
        return query(2*rt+1, l, r);
    else
    {
        int v1 = query(2*rt, l, mid);
        int v2 = query(2*rt+1, mid+1, r);
        return max(v1, v2);
    }
}

int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d", &n);
        if(n==0) continue;
        for(int i=1; i<=n; i++)
            scanf("%d", &a[i]);
        build(1, 1, n);
        int q;
        scanf("%d", &q);
        for(int i=0; i<q; i++)
        {
            int l, r;
            scanf("%d%d", &l, &r);
            printf("%d\n", query(1, l, r));
        }
    }
    return 0;
}

 

posted @ 2015-11-18 19:08  xing-xing  阅读(111)  评论(0)    收藏  举报