poj3264 线段树维护最大值最小值

用线段树来维护区间的最大值最小值  
建好线段树,就可以针对查询来查出最大值最小值 

从而求出其差值

<span style="white-space:pre">	</span>#include <set>
	#include <map>
	#include <queue>
	#include <stack>
	#include <deque>
	#include <math.h>
	#include <string>
	#include <vector>
	#include <stdio.h>
	#include <iostream>
	#include <string.h>
	#include <algorithm>
	#include <functional>
	#define mem(a) memset(a,0,sizeof(a));
	#define mem_1(a) memset(a,-1,sizeof(a));
	#define sf(a) scanf("%d",&a)
	#define sff(a,b) scanf("%d%d",&a,&b)
	#define sfff(a,b,c) scanf("%d%d%d",&a,&b,&c)
	#define lson l,mid,i<<1
	#define rson mid+1,r,i<<1|1
	const int INF = 0x7FFFFFFF;
	const int MAXN = 50100;
	const double PI = acos(-1.0);
	const double esp = 1e-10;
	using namespace std;
	struct node
	{
		int l,r,Max,Min;
	}Tree[MAXN<<2];
	int xx;
	int MAX,MIN;
	void build_tree(int l,int r,int i)
	{
		Tree[i].l = l;
		Tree[i].r = r;
		if(l == r)
		{
			sf(xx);
			Tree[i].Max = Tree[i].Min = xx;
			return ;
		}
		int mid = (l+r)>>1;
		build_tree(lson);
		build_tree(rson);
		Tree[i].Max = max(Tree[i<<1].Max,Tree[i<<1|1].Max);
		Tree[i].Min = min(Tree[i<<1].Min,Tree[i<<1|1].Min);
	}
	void Query(int l,int r,int i)
	{
		if(Tree[i].l == l && Tree[i].r ==r)
		{
			MAX = max(MAX,Tree[i].Max);
			MIN = min(MIN,Tree[i].Min);
			return ;
		}
		int mid = (Tree[i].l + Tree[i].r) >>1;
		if(r <= mid) Query(l,r,i<<1);
		else if(mid < l) Query(l,r,i<<1|1);
		else
		{
			Query(lson);
			Query(rson);
		}
	}
	int main()
	{
		int n,m,x,y;

		sff(n,m);
		build_tree(1,n,1);
		while(m--)
		{
			sff(x,y);
			MAX = -1;
			MIN = INF;
			Query(x,y,1);
			printf("%d\n",MAX - MIN);
		}
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值