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;

}

 

你可能感兴趣的:(love)