现在的位置: 首页 > 综合 > 正文

HDU-1754 I Hate It 线段树 链式

2012年09月09日 ⁄ 综合 ⁄ 共 1285字 ⁄ 字号 评论关闭

  以下代码G++超时,C++勉强过,果然是链式的伤不起啊!!!

#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;

int N, M, rec[200010];

struct Node
{
	int l, r, best;
	Node *lch, *rch;
	Node( int ll, int rr )
	{
		l= ll, r= rr, best= 0, lch= rch= NULL;
	}
	int mid(  )
	{
		return ( l+ r )>> 1;
	}
};

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

void creat( Node *p )
{
	if( p-> r- p->l> 1 )
	{
		p->lch= new Node( p->l, p->mid() );
		p->rch= new Node( p->mid(), p->r );
		creat( p->lch ), creat( p->rch );
	}
}

int update( Node *p, int pos, int up )
{
	if( p->r- p->l== 1 )
	{
		p->best= up;
		return p->best;
	}
	if( pos>= p->mid() )
	{
		p->best= max( p->best, update( p->rch, pos, up ) );
	}
	else
	{
		p->best= max( p->best, update( p->lch, pos, up ) );
	}
}

int get( Node* p, int l, int r )
{
	if( p->l== l&& p->r== r )
	{
		return p->best;
	}
	if( l>= p->mid() )
	{
		return get( p->rch, l ,r );
	}
	else if( r<= p->mid() )
	{
		return get( p->lch, l, r );
	}
	else
	{
		return max( get( p->lch, l, p->mid() ), get( p->rch, p->mid(), r ) );
	}
}

void _free( Node *p )
{
	if( p->lch )
	{
		_free( p->lch );
	}
	if( p->rch )
	{
		_free( p->rch );
	}
	free( p );
}

void getint( int &num )
{
    char c;
    while( c = getchar(), c< '0'|| c> '9' )  ;
    num = c- '0';
    while( c= getchar(), c>= '0'&& c<= '9' )
    {
        num= num* 10+ c- '0';
    }
}

int main(  )
{
	while( scanf( "%d %d", &N, &M )!= EOF )
	{
		char op[5];
		Node *r= new Node( 1, N+ 1 );
		creat( r );	
		for( int i= 1; i<= N; ++i )
		{
		    int c;
		    getint( c );
			update( r, i, c );
		}	
		for( int i= 1; i<= M; ++i )
		{
			int x, y;
			scanf( "%s", op );
			getint( x ), getint( y );
			if( 'U' == op[0] )
			{
				update( r, x, y );
			}
			else if( 'Q' ==op[0]  )
			{
				printf( "%d\n", get( r, x, y+ 1 ) );
			}
		}
		_free( r );  // 释放所有节点
	}
}

  

抱歉!评论已关闭.