poj - 3264 Balanced Lineup

本文介绍了一种通过预处理方式快速查询指定范围内最大值与最小值,并计算两者差值的方法。利用两个数组分别记录各区间最大值和最小值,通过递归方式减少查询时间复杂度。

简单题,求一定范围内的最大数于最小数之差,用两个数组保存max和min就行了。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define N 50005
 4 #define INF 0x7fffffff
 5 int max[4*N],min[4*N];
 6 int D;
 7 int Max(int a,int b)
 8 {
 9     return a>b ?a :b;
10 }
11 int Min(int a,int b)
12 {
13     return a<b ?a :b;
14 }
15 int query(int a,int b)
16 {
17     int i=D+a-1, j=D+b+1;
18     int mi=INF,ma=-INF;
19     for(; i+1 != j; i>>=1, j>>=1)
20     {
21         if(~i & 1)
22             mi = Min(mi,min[i^1]),
23             ma = Max(ma,max[i^1]);
24         if(j & 1)
25             mi = Min(mi,min[j^1]),
26             ma = Max(ma,max[j^1]);
27     }
28     return ma-mi;
29 }
30 int main()
31 {
32     int m,n,i,x,y;
33     while(~scanf("%d%d",&n,&m))
34     {
35         for(D = 1; D < n+2; D <<= 1);
36         memset(max,0xc3,sizeof(int)*2*D);
37         memset(min,0x3f,sizeof(int)*2*D);
38         for(i = 1; i <= n; i++)
39         {
40             scanf("%d",&max[D+i]);
41             min[D+i] = max[D+i];
42         }
43         for(i = D-1; i; i--)
44         {
45             max[i] = Max(max[i<<1],max[i<<1|1]);
46             min[i] = Min(min[i<<1],min[i<<1|1]);
47         }
48         while(m--)
49         {
50             scanf("%d%d",&x,&y);
51             printf("%d\n",query(x,y));
52         }
53     }
54     return 0;
55 }

 

转载于:https://www.cnblogs.com/lzxskjo/archive/2012/07/14/2591008.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值