HDU 1754 I Hate It!(线段树)

来源:互联网 发布:阿里云 数据库 用法 编辑:程序博客网 时间:2024/06/08 02:02

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1754

题解:

线段树记录一下最大值搞一搞就好了,注意要用scanf输入,同时数据不止一组。

AC代码:

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#define lc (d<<1)#define rc (d<<1|1)#define mid ((l+r)>>1)using namespace std;int b[200050];struct node{    int mx, l, r;}tr[800000];void build(int d, int l, int r){    tr[d].l = l, tr[d].r = r;    if(l == r)    {        tr[d].mx = b[l];        return ;    }    build(lc, l, mid);    build(rc, mid+1, r);    tr[d].mx = max(tr[lc].mx, tr[rc].mx);}int query(int d, int l, int r, int L, int R){    if(tr[d].l == L && tr[d].r == R)    {        return tr[d].mx;    }    if(R <= mid)return query(lc,l,mid,L,R);    else if(L > mid)return query(rc,mid+1,r,L,R);    else        return max(query(lc, l, mid,L,mid), query(rc, mid+1, r,mid+1,R));}void update(int d, int pos, int k){    if(tr[d].l == pos && tr[d].l == tr[d].r)    {        tr[d].mx = k;        return;    }    int midd = (tr[d].r + tr[d].l)/2;    if(pos <= midd)update(lc,pos,k);    else        update(rc,pos,k);    tr[d].mx = max(tr[lc].mx, tr[rc].mx);}int main(){    int n ,m;    while(~scanf("%d%d", &n, &m))    {        char s[2];        int n1,n2;        for(int i = 1; i <= n; i++)        {            int grade;            scanf("%d",&grade);            b[i] = grade;        }        build(1,1,n);        while(m--)        {            scanf("%s", &s);            scanf("%d%d", &n1, &n2);            if(s[0] == 'Q')                cout << query(1,1,n,n1,n2) <<endl;            else                update(1, n1 ,n2);        }    }    return 0;}
0 0
原创粉丝点击