hdu 1754 I Hate It

来源:互联网 发布:win7红警网络点不进去 编辑:程序博客网 时间:2024/06/05 18:59
////HDU 1754 I Hate It (线段树模板题)更新一点的值 询问区间最大值#include<iostream>#include<stdio.h>#include<string.h>#define MAXX 5001000using namespace std;int A[MAXX] ;struct node{    int l ;    int r ;    int value ;} node[MAXX] ;int  creattree (int ll , int rr , int i)  // 创建线段树  将最大值更新在根节点{    int mid = (ll + rr) / 2;    node[i].l = ll ;    node[i].r = rr ;    if (ll  == rr)         {        node[i].value = A[ll] ;        return node[i].value ;    }    else    {        node[i].value = max (creattree(ll , mid , 2*i),creattree(mid+1 , rr , 2*i+1));        return node[i].value ;    }}void updata (int i , int pos , int d ) // 更改一点的值{    int mid ;    node[i].value = max (node[i].value , d) ;    mid = (node[i].l + node[i].r) / 2 ;    if(node[i].l == node[i].r)        return ;    else  if (pos > mid) // 更新右子树        updata(2*i+1 , pos , d) ;    else                   //  更新左子树        updata(2*i , pos , d);}int query (int i , int ll , int rr){    int mid = (node[i].l + node[i].r) / 2 ;    if(node[i].l == ll && node[i].r == rr )        return node[i].value ;    if(ll <= mid && rr >= mid+1 )     //区间被分成两部分         return max (query(2*i , ll , mid),query(2*i+1 , mid+1 , rr));    else if(rr <= mid && ll<=mid )    //区间在右子树         return query(2*i , ll , rr) ;    else                               //区间在左子树        return query(2*i+1 , ll , rr) ;}int main(){    int n  , m , i , a , b ;    char s ;    while(scanf("%d%d",&n,&m)!=EOF)    {        for(i = 1 ; i <= n ; i++)        {           scanf("%d",&A[i]);        }        creattree(1 , n , 1 );        while(m--)        {            getchar();            scanf("%c%d%d",&s,&a,&b);            if(s == 'U')            {                updata(1 , a , b ) ;            }            if(s == 'Q')            {                int ans = query(1 , a , b );                printf("%d\n",ans);            }        }    }    return 0;}

 

 


 

// 树状数组#include<stdio.h>#include<string.h>#include<string>#include<iostream>#define MAXX 201000using namespace std;int C[MAXX] ,n , A[MAXX];int lowbit(int x){    return x &(-x) ;}void init(){    for(int i=1 ; i <= n ; i++)    {        C[i]=A[i];        for(int j=1; j<lowbit(i) ; j<<=1)        {            C[i]=max(C[i],C[i-j]);        }    }}void add(int pos ,int d){    A[pos]=d;    while(pos<=n)    {        C[pos]=max(C[pos],d);        pos+=lowbit(pos);    }//    for(int i=pos; i<=n; i+=lowbit(i))//    {//        C[i]=d;//        for(int j=1; j<lowbit(i); j<<=1)//        {//            C[i]=max(C[i],C[i-j]);//        }//    }}void query(int l, int r){    int ans=A[r];    while(1)    {        ans=max(ans,A[r]);        if(r==l)            break;        for(r=r-1; r-l>=lowbit(r); r-=lowbit(r))        {            ans=max(ans,C[r]);        }    }    printf("%d\n",ans);}int main(){    int   m , i ,l , r ;    char s ;    while (scanf("%d%d",&n,&m)!=EOF)    {        memset(C,0,sizeof(C));        for ( i = 1 ; i <= n ; i++ )        {            scanf ("%d", &A[i]);        }        init();        while(m--)        {            getchar();            scanf("%c",&s);            scanf("%d%d",&l,&r);            if(s == 'U')            {                add(l,r);            }            if( s == 'Q')            {                query(l,r);            }        }    }    return  0 ;}

0 0