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

#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[N]	= min( min_ar[2 * N], min_ar[2 * N + 1] );
	max_ar[N]	= max( max_ar[2 * N], max_ar[2 * N + 1] );
}


void build( int N, int L, int R )
{
	if ( L == R )
	{
		min_ar[N]	= data[L];
		max_ar[N]	= 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[N]);
		else
			return(max_ar[N]);
	}
	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);
}

原创文章 54 获赞 168 访问量 63万+

猜你喜欢

转载自blog.csdn.net/bojie5744/article/details/51133522
今日推荐