xfstart07
Get busy living or get busy dying

#include < iostream >
using   namespace  std;

typedef 
struct {
    
int  l,r;
    
int  sum;
    
int  value;
    
int  lvalue;
    
int  rvalue;
}Node;
Node tree[
250000 ];
inline 
int  max( int  a, int  b){
    
if (a > b)  return  a;
    
else   return  b;
}
void  build( int  Num, int  l, int  r){
    tree[Num].l
= l;
    tree[Num].r
= r;
    tree[Num].value
= 0 ;
    
if (l < r){
        
int  mid = (l + r) >> 1 ;
        build(Num
* 2 ,l,mid);
        build(Num
* 2 + 1 ,mid + 1 ,r);
    }
}
void  modify( int  Num){
    tree[Num].sum
= tree[Num * 2 ].sum + tree[Num * 2 + 1 ].sum;   // 区间的总和
    tree[Num].lvalue = max(tree[Num * 2 ].lvalue,tree[Num * 2 ].sum + tree[Num * 2 + 1 ].lvalue);
    
// 左边的最大值=左孩子左边的值,或者左孩子的总和加右孩子左边的值(即通过中间点)
    tree[Num].rvalue = max(tree[Num * 2 + 1 ].rvalue,tree[Num * 2 + 1 ].sum + tree[Num * 2 ].rvalue);
    
// 右边的最大值=右孩子右边的值,或者右孩子的综合加左孩子右边的值(即通过中间点)
    tree[Num].value = tree[Num * 2 ].rvalue + tree[Num * 2 + 1 ].lvalue;
    
// 父亲的最大值=左孩子右边的值加上右孩子左边的值(即通过中间点)
    tree[Num].value = max(tree[Num].value,tree[Num * 2 ].value);
    
// 可能只在左边
    tree[Num].value = max(tree[Num].value,tree[Num * 2 + 1 ].value);
    
// 可能只在右边
}
void  insert( int  Num, int  r, int  value){
    
if (tree[Num].l == tree[Num].r){
        tree[Num].sum
= value;
        tree[Num].value
= value;
        tree[Num].lvalue
= value;
        tree[Num].rvalue
= value;
        
return  ;
    }
    
int  mid = (tree[Num].l + tree[Num].r) >> 1 ;
    
if (r <= mid) insert(Num * 2 ,r,value);
    
else  insert(Num * 2 + 1 ,r,value);
    modify(Num);
}
Node query(
int  Num, int  l, int  r){
    
if (l == tree[Num].l && r == tree[Num].r)
        
return  tree[Num];
    
int  mid = (tree[Num].l + tree[Num].r) >> 1 ;
    
if (r <= mid)  return  query(Num * 2 ,l,r);
    
else   if (l > mid)  return  query(Num * 2 + 1 ,l,r);
    
else {
        Node lt
= query(Num * 2 ,l,mid);
        Node rt
= query(Num * 2 + 1 ,mid + 1 ,r);
        Node tmp;
        tmp.sum
= lt.sum + rt.sum;
        tmp.lvalue
= max(lt.lvalue,lt.sum + rt.lvalue);
        tmp.rvalue
= max(rt.rvalue,rt.sum + lt.rvalue);
        tmp.value
= lt.rvalue + rt.lvalue;
        tmp.value
= max(tmp.value,lt.value);
        tmp.value
= max(tmp.value,rt.value);
        
return  tmp;
    }
}
int  main()
{
    
int  n,m,x,y,z;
    scanf(
" %d " , & n);
    build(
1 , 1 ,n);
    
for ( int  i = 1 ;i <= n; ++ i){
        scanf(
" %d " , & x);
        insert(
1 ,i,x);
    }
    scanf(
" %d " , & m);
    
for ( int  i = 1 ;i <= m; ++ i){
        scanf(
" %d%d%d " , & z, & x, & y);
        
if (z)
            printf(
" %d\n " ,query( 1 ,x,y).value);
        
else  insert( 1 ,x,y);
    }
    
return   0 ;
}


vijos1083,虽然一样的题目,但是orz出题的人~~~,还是贴出来吧!
#include<iostream>
using namespace std;

struct Node{
    
int l,r;
    
int sum;
    
int value;
    
int lvalue,rvalue;
};
Node tree[
2100000];
int A[500010];
inline 
int max(int a,int b){
    
return a>b?a:b;
}
void modfiy(int Num){
    tree[Num].sum
=tree[Num*2].sum+tree[Num*2+1].sum;
    tree[Num].lvalue
=max(tree[Num*2].lvalue,tree[Num*2].sum+tree[Num*2+1].lvalue);
    tree[Num].rvalue
=max(tree[Num*2+1].rvalue,tree[Num*2+1].sum+tree[Num*2].rvalue);
    tree[Num].value
=tree[Num*2].rvalue+tree[Num*2+1].lvalue;
    tree[Num].value
=max(tree[Num].value,tree[Num*2].value);
    tree[Num].value
=max(tree[Num].value,tree[Num*2+1].value);
}
void build(int Num,int l,int r){
    tree[Num].l
=l;
    tree[Num].r
=r;
    
if(l<r){
        
int mid=(l+r)>>1;
        build(Num
*2,l,mid);
        build(Num
*2+1,mid+1,r);
        modfiy(Num);
    }
    
else{
        tree[Num].sum
=A[r];
        tree[Num].value
=A[r];
        tree[Num].lvalue
=A[r];
        tree[Num].rvalue
=A[r];
    }
}
void insert(int Num,int r,int value){
    
if(tree[Num].l==tree[Num].r){
        tree[Num].sum
=value;
        tree[Num].value
=value;
        tree[Num].lvalue
=value;
        tree[Num].rvalue
=value;
        
return;
    }
    
int mid=(tree[Num].l+tree[Num].r)>>1;
    
if(r<=mid) insert(Num*2,r,value);
    
else insert(Num*2+1,r,value);
    modfiy(Num);
}
Node query(
int Num,int l,int r){
    
if(l==tree[Num].l&&r==tree[Num].r)
        
return tree[Num];
    
int mid=(tree[Num].l+tree[Num].r)>>1;
    
if(r<=mid) return query(Num*2,l,r);
    
else if(l>mid) return query(Num*2+1,l,r);
    
else{
        Node lt
=query(Num*2,l,mid);
        Node rt
=query(Num*2+1,mid+1,r);
        Node tmp;
        tmp.sum
=lt.sum+rt.sum;
        tmp.lvalue
=max(lt.lvalue,lt.sum+rt.lvalue);
        tmp.rvalue
=max(rt.rvalue,rt.sum+lt.rvalue);
        tmp.value
=lt.rvalue+rt.lvalue;
        tmp.value
=max(tmp.value,lt.value);
        tmp.value
=max(tmp.value,rt.value);
        
return tmp;
    }
}
int main()
{
    
int n,m;
    
int x,y,z;
    scanf(
"%d%d",&n,&m);
    
for(int i=1;i<=n;++i)
        scanf(
"%d",&A[i]);
    build(
1,1,n);
    
for(int i=1;i<=m;++i){
        scanf(
"%d%d%d",&z,&x,&y);
        
if(z==1){
            
if(x>y){
                
int tmp=x;
                x
=y;y=tmp;
            }
            
int ans=query(1,x,y).value;
            printf(
"%d ",ans);
        }
        
else
            insert(
1,x,y);
    }
    
return 0;
}


posted on 2009-04-26 15:47 xfstart07 阅读(169) 评论(0)  编辑 收藏 引用 所属分类: 代码库

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理