您的位置:首页 > 其它

hdu 1754 I Hate It (线段树)

2014-11-07 12:22 295 查看
传送门:点击打开链接

题目大意:

线段树入门题。

两种操作:

1. 区间查询最大值。

2. 单点修改。

#include <cstdio>
#define maxn 200010
struct Node
{
    int l,r,ma;
}tree[maxn<<2];

inline int max(int a,int b)
{
    return a>b?a:b;
}

inline void pushup(int id)
{
    tree[id].ma = max(tree[id<<1].ma,tree[id<<1|1].ma);
}

void build(int id,int l,int r)
{
    tree[id].l = l;
    tree[id].r = r;
    if(l == r)
    {
        int x;
        scanf("%d",&x);
        tree[id].ma = x;
        return;
    }
    int mid = (l+r)>>1;
    build(id<<1,l,mid);
    build(id<<1|1,mid+1,r);
    pushup(id);
}

int query(int id,int l,int r)
{
    if(tree[id].l >= l && tree[id].r <= r)
    {
        return tree[id].ma;
    }
    int mid = (tree[id].l+tree[id].r )>>1;
    int res = 0x80808080;
    if(l <= mid)
        res = max(res,query(id<<1,l,r));
    if(r > mid)
        res = max(res,query(id<<1|1,l,r));
    return res;
}

void update(int id,int pos,int x)
{
    if(tree[id].l == tree[id].r)
    {
        tree[id].ma = x;
        return;
    }
    int mid = (tree[id].l + tree[id].r)>>1;
    if(pos <= mid)
        update(id<<1,pos,x);
    else
        update(id<<1|1,pos,x);
    pushup(id);
}

int main()
{
    int n,m;
    while(scanf("%d %d",&n,&m) != EOF)
    {
        build(1,1,n);
        while(m--)
        {
            char a[10];
            scanf("%s",a);
            if(a[0] == 'Q')
            {
                int l,r;
                scanf("%d %d",&l,&r);
                printf("%d\n",query(1,l,r));
            }
            else
            {
                int pos,x;
                scanf("%d %d",&pos,&x);
                update(1,pos,x);
            }
        }
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: