您的位置:首页 > 其它

HDU 1823 Luck and Love

2012-08-01 11:01 302 查看
一道二维线段树题,求区间最大值:

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: