您的位置:首页 > 产品设计 > UI/UE

HDU 1166 点更新段查询线段树

2012-09-05 12:22 246 查看
很久没做线段树的题目了。自己想想延迟标记怎么弄...

#include<iostream>
#define MAXN 55555
using namespace std;

int tree[MAXN<<2];

void pushUp( int rt )
{
tree[rt]=tree[rt<<1]+tree[rt<<1|1];
}

void build( int l,int r,int rt )
{
if( l==r )
{
scanf( "%d",&tree[rt] );
return ;
}
int m=(l+r)/2;
build( l,m,rt<<1 );
build( m+1,r,rt<<1|1 );
pushUp( rt );
}

int query( int L,int R,int l,int r,int rt )
{
if( L<=l&&r<=R )
return tree[rt];
int m=(l+r)/2;
int ret=0;
if( m>=R )
ret+=query( L,R,l,m,rt<<1 );
if( L>=m+1 )
ret+=query( L,R,m+1,r,rt<<1|1 );
if( L<m+1 && m<R )
{
ret+=query( L,R,l,m,rt<<1 );
ret+=query( L,R,m+1,r,rt<<1|1 );
}
return ret;
}

void add( int pt,int v,int l,int r,int rt )
{
if( l==r )
{
tree[rt]+=v;
return ;
}
int m=(l+r)/2;
if( pt<=m )
add( pt,v,l,m,rt<<1 );
else
add( pt,v,m+1,r,rt<<1|1 );
pushUp(rt);
}

int main()
{
int T,cases=1;
scanf( "%d",&T );
while( T-- )
{
printf( "Case %d:\n",cases++ );
int N;
scanf( "%d",&N );
build( 1,N,1 );
char str[111];
getchar();
while( gets(str) )
{
int n1,n2;
if( sscanf(str,"Query %d %d",&n1,&n2) )
printf( "%d\n",query(n1,n2,1,N,1) );
else if( sscanf(str,"Sub %d %d",&n1,&n2) )
add( n1,-n2,1,N,1 );
else if( sscanf(str,"Add %d %d",&n1,&n2) )
add( n1,n2,1,N,1 );
else if( strcmp(str,"End")==0 )
break;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  tree query build n2