您的位置:首页 > 其它

题目1544:数字序列区间最小值

2013-12-09 20:14 267 查看
题目描述:
给定一个数字序列,查询任意给定区间内数字的最小值。

输入:
输入包含多组测试用例,每组测试用例的开头为一个整数n(1<=n<=100000),代表数字序列的长度。
接下去一行给出n个数字,代表数字序列。数字在int范围内。
下一行为一个整数t(1<=t<=10000),代表查询的次数。
最后t行,每行给出一个查询,由两个整数表示l、r(1<=l<=r<=n)。

输出:
对于每个查询,输出区间[l,r]内的最小值。

样例输入:
5
3 2 1 4 3
3
1 3
2 4
4 5

样例输出:
1
1
3


#include <stdio.h>
#include <math.h>

#define N 100001

#define max(a,b) a>b?a:b
#define min(a,b) a<b?a:b

int array
;
int RMQ_min
[20];
int RMQ_max
[20];

void RMQ(int n)
{
int i;
int j;

for(i = 1; i <= n; i++)
{
RMQ_min[i][0] = RMQ_max[i][0] = array[i];
}

double limit = log((double)n)/log(2.0);

for(j = 1 ; j <= (int)limit; j++)
for(i = 1; i + (1 << j) -1 <= n; i++)
{
RMQ_max[i][j] = max(RMQ_max[i][j-1], RMQ_max[i+(1<<(j-1))][j-1]);
RMQ_min[i][j] = min(RMQ_min[i][j-1], RMQ_min[i+(1<<(j-1))][j-1]);
}

}

int Max(int a, int b)
{
int k = (int)(log((double)(b-a+1))/log(2.0));
return max(RMQ_max[a][k],RMQ_max[b-(1<<k)+1][k]);
}

int Min(int a, int b)
{
int k = (int)(log((double)(b-a+1))/log(2.0));
return min(RMQ_min[a][k],RMQ_min[b-(1<<k)+1][k]);
}

int main()
{

int n;
int i;
int j;
int t;
int a;
int b;
int T[10001];
int TT;

while(scanf("%d",&n) != EOF)
{
for(i = 1 ; i <= n; i++)
{
scanf("%d",array+i);
}

RMQ(n);

j = 1;
scanf("%d",&t);
TT = t;

while( t-- )
{
scanf("%d%d",&a, &b);
T[j++] = Min(a,b);
}

for(i = 1 ;i <= TT; i++)
{
printf("%d\n",*(T+i));
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: