poj 3264 Balanced Lineup

本文介绍如何使用线段树解决查找给定区间内最大和最小值差值的问题,通过构建线段树并进行区间查询,实现高效求解。包括代码实现和时间复杂度分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线段树!憋不住,还是做了一题,不过也做的我够呛。。慢慢爬的孩子伤不起!!!

题意就是: 找出给定区间内最大的值和最小的值的差值!


Memory: 2412KTime: 1625MSLanguage: C++Result: Accepted


#include<stdio.h>

#define MAXN 50001

#define MAX(a,b) a>b?a:b

#define MIN(a,b) a<b?a:b

int val[MAXN];

struct node 

{

int r,l;

int max,min;

}f[4*MAXN];

int max,min;

void build(int l,int r,int step)

{

f[step].l=l;

f[step].r=r;

if(l==r)

{

f[step].max=f[step].min=val[l];

return;

}

int mid=(l+r)>>1;

build(l,mid,step<<1);

build(mid+1,r,step<<1|1);

f[step].max=MAX(f[step<<1].max,f[step<<1|1].max);

f[step].min=MIN(f[step<<1].min,f[step<<1|1].min);

// printf("%d %d step:%d l:%d r:%d\n",f[step].max,f[step].min,step,f[step].l,f[step].r);

}



void query(int l,int r,int step)

{

if(l==f[step].l&&r==f[step].r)

{

max=MAX(max,f[step].max);

min=MIN(min,f[step].min);

return;

}

int mid=(f[step].r+f[step].l)>>1;

if(r<=mid)

query(l,r,step<<1);

else if(l>mid)

query(l,r,step<<1|1);

else

{

query(l,mid,step<<1);

query(mid+1,r,step<<1|1);

}

}



int main()

{

int n,m,i,a,b;

scanf("%d%d",&n,&m);

for(i=1;i<=n;i++)

scanf("%d",&val[i]);

build(1,n,1);

for(i=1;i<=m;i++)

{

scanf("%d%d",&a,&b);

max=0,min=1<<20;

        query(a,b,1);

printf("%d\n",max-min);

}

return 0;;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值