zoukankan      html  css  js  c++  java
  • HDU1754 I Hate It 线段树 链式

      以下代码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 );  // 释放所有节点
    	}
    }
    

      

  • 相关阅读:
    mysql无法导出表内容
    mysql回收用户权限
    mysql跳过授权表进入服务
    数组forEach函数
    数组的filter函数
    无符号右移运算
    按位非运算符
    TP5页面跳转与重定向
    thinkphp5 $this->fetch()
    linux下vi命令修改文件及保存的使用方法
  • 原文地址:https://www.cnblogs.com/Lyush/p/2139734.html
Copyright © 2011-2022 走看看