HDU 1823 Luck and Love

一道二维线段树题,求区间最大值:

View Code
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<cstring>
#include<vector>
#include<string>
#define LL long long
using namespace std;
class Node
{
public:
      int l,r,sum;
      double max;
}n[3024][324];
class Tree
{
public:
      int l , r;    
}T[3024];
double Max;
void build_y( Node *p ,int l , int r, int cnt )
{
     p[cnt].l = l ; p[cnt].r = r;
     p[cnt].max = -1.0;
     if( l >= r ) return;
     int mid = ( l + r ) >>1;
     build_y( p , l ,mid , 2*cnt );
     build_y( p , mid + 1, r , cnt*2 + 1 );    
}
void build( int l, int r, int cnt )
{
    T[cnt].l = l , T[cnt].r = r;
    build_y( n[cnt], 0 , 100 , 1 );
    if( l >= r ) return ;
    int mid = ( l + r )>>1;
    build( l , mid , cnt*2 );
    build( mid + 1 , r , cnt * 2 + 1 );    
}
void modify_y( Node *p,int l , int r , int cnt , double L )
{
     if( p[cnt].max < L ) 
            p[cnt].max = L;
     if( p[cnt].l >= p[cnt].r ) return;    
     int mid = ( p[cnt].l + p[cnt].r )>>1;
     if( mid >= r )modify_y( p , l , r , cnt*2 , L );
     else modify_y( p , l , r , cnt*2 + 1 , L );
}
void modify( int l , int r , int cnt ,int y1, int y2,double L ) 
{
     modify_y( n[cnt], y1 ,y2 ,1 ,L );        
     if( T[cnt].l >= T[cnt].r ) return;
     int mid = ( T[cnt].l + T[cnt].r )>>1;
     if( mid >=r ) modify( l , r, cnt*2 , y1 ,y2 ,L );
     else modify( l , r , cnt*2 + 1, y1 ,y2 , L );    
}
void Cal_y( Node *p ,int l , int r , int cnt )
{
    if( l <= p[cnt].l && r >= p[cnt].r )
    {
        if( p[cnt].max > Max ) Max = p[cnt].max;
        return ;    
    }    
    int mid = ( p[cnt].l + p[cnt].r )>>1;
    if( mid >= r ) Cal_y( p , l , r , cnt*2 );
    else if( mid < l ) Cal_y( p , l , r, cnt*2 + 1 );
    else
    {
        Cal_y( p , l , mid , cnt*2 );
        Cal_y( p , mid + 1 , r, cnt*2 +1 );    
    }
}
void Cal( int l, int r, int y1, int y2 , int cnt )
{
     if( l <= T[cnt].l && r >= T[cnt].r )
     {
         Cal_y( n[cnt] ,y1 , y2 ,1 );
         return ;        
     }    
     int mid = ( T[cnt].r + T[cnt].l )>>1;
     if( mid >= r ) Cal( l , r , y1 , y2 , cnt*2 );
     else if( mid < l ) Cal( l , r , y1, y2,cnt*2 +1 );
     else
     {
         Cal( l , mid , y1 ,y2 ,cnt*2 );
         Cal( mid + 1, r , y1, y2 , cnt*2 +1 );        
     }
}
int main(  )
{
    int N,x1,y1,H;
    double x,y;
    char str[3];
    while( scanf( "%d",&N ) , N )
    {
        build( 0 , 1000 , 1 );
        for( int i = 0 ; i <  N ; i ++ )
        {
            scanf( "%s",str );
            if( str[0] == 'I' )
            {
                scanf( "%d %lf %lf",&H,&x,&y );
                modify(  (int)(x*10.0), (int)(x*10.0)  , 1 , H-100 ,H-100 , y );    
            }
            else
            {
               Max = -1.0;
               scanf( "%d %d %lf %lf",&x1,&y1,&x,&y );
               if( x > y ) swap( x , y ) ; if( x1 > y1 ) swap( x1 , y1 );
               Cal( (int)(x*10.0),(int)(y*10.0) , x1-100 , y1-100 ,1 );
               if( Max < 0 ) printf( "-1\n" );
               else 
               printf( "%.1lf\n", Max );    
            }
        }    
    }
    //system( "pause" );
    return 0;
}

 

posted @ 2012-08-01 11:01  wutaoKeen  阅读(190)  评论(0编辑  收藏  举报