您的位置:首页 > 其它

线段树求解区间最大最小值

2016-04-12 14:59 113 查看
#include <bits/stdc++.h>
using namespace std;
#define MAXN 256
int	min_ar[MAXN*5];
int	max_ar[MAXN*5];
int	data[MAXN];

void pushUp( int N )
{
min_ar
= min( min_ar[2 * N], min_ar[2 * N + 1] );
max_ar
= max( max_ar[2 * N], max_ar[2 * N + 1] );
}

void build( int N, int L, int R )
{
if ( L == R )
{
min_ar
= data[L];
max_ar
= data[L];
return;
}
int M = (L + R) >> 1;
build( 2 * N, L, M );
build( 2 * N + 1, M + 1, R );
pushUp( N );
}

int query( string type, int N, int L, int R, int l, int r )
{
int rs1, rs2;
if ( l > R || r < L )
return(-1);
if ( L >= l && R <= r )
{
if ( type == "min" )
return(min_ar
);
else
return(max_ar
);
}
int M = (L + R) >> 1;
rs1	= query( type, 2 * N, L, M, l, r );
rs2	= query( type, 2 * N + 1, M + 1, R, l, r );

if ( rs1 == -1 )
return(rs2);
if ( rs2 == -1 )
return(rs1);
if ( type == "min" )
{
if ( rs1 <= rs2 )
return(rs1);
return(rs2);
}   else{
if ( rs1 <= rs2 )
return(rs2);
return(rs1);
}
}

int main()
{
srand( (unsigned) time( NULL ) );
int N = 9;
for ( int i = 0; i != N; ++i )
{
printf( "%5d ", i );
}
printf( "\n" );
for ( int i = 0; i != N; ++i )
{
data[i] = rand();
printf( "%5d ", data[i] );
}
printf( "\n" );
build( 1, 0, N-1 );
while ( true )
{
int x, y;
printf( "输入数组查询范围x y\n" );
scanf( "%d%d", &x, &y );
printf( "%d\n", query( "min", 1, 0,  N-1, x, y ) );
}
return(0);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: