POJ-3264-Balanced Lineup

本文介绍了一种基于线段树的数据结构实现方法,通过构建和查询操作来维护区间内的最大值和最小值。适用于解决区间查询问题,代码简洁且易于理解。

比较纯的线段树吧,只需要写出一个构造函数和一个查询函数即可,不算太难

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=50001;
const int inf=1<<28;
struct node
{
    int mini;
    int maxi;
}t[maxn*3];
int c[maxn];
int n,q,ansa,ansb;
void Built(int L,int R,int index)
{
    if(L==R)
    {
	t[index].maxi=t[index].mini=c[L];
	return;
    }
    int mid=(L+R)>>1;
    Built(L,mid,index<<1);
    Built(mid+1,R,index<<1|1);
    t[index].mini=min(t[index<<1].mini,t[index<<1|1].mini);
    t[index].maxi=max(t[index<<1].maxi,t[index<<1|1].maxi);
}
void Query(int l,int r,int L,int R,int index)
{
    if(l==L&&r==R)
    {
	ansa=min(ansa,t[index].mini);
	ansb=max(ansb,t[index].maxi);
	return;
    }
    int mid=(L+R)>>1;
    if(r<=mid)
    {
	Query(l,r,L,mid,index<<1);
	return;
    }
    if(l>mid)
    {
	Query(l,r,mid+1,R,index<<1|1);
	return;
    }
    Query(l,mid,L,mid,index<<1);
    Query(mid+1,r,mid+1,R,index<<1|1);
}
int main()
{
    while(scanf("%d%d",&n,&q)!=EOF)
    {
	for(int i=1;i<=n;i++)
	    scanf("%d",&c[i]);
	Built(1,n,1);
	for(int i=0;i<q;i++)
	{
	    int ita,itb;
	    scanf("%d%d",&ita,&itb);
	    ansa=inf;
	    ansb=0;
	    Query(ita,itb,1,n,1);
	    printf("%d\n",ansb-ansa);
	}
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值