一道二维线段树题,求区间最大值:
#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; }