您的位置:首页 > 其它

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

2013-10-07 09:36 302 查看
题目1544:数字序列区间最小值

时间限制:1 秒

内存限制:128 兆

特殊判题:

题目描述:
给定一个数字序列,查询任意给定区间内数字的最小值。

输入:
输入包含多组测试用例,每组测试用例的开头为一个整数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 <iostream>
#include <stdio.h>
#include <queue>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <queue>
#include <set>
#include <algorithm>
#include <map>
#include <math.h>
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std ;
typedef long long LL ;
const int N_size=100008 ;
int N ,M ;
struct Seg{
int left ;
int right ;
int min_num ;
}seg[N_size*3];  //二叉树性质,注意这个地方
int num[N_size] ;
void make_tree(int L ,int R ,int id){
seg[id].left=L ;
seg[id].right=R ;
if(L==R){
seg[id].min_num=num[L] ;
return  ;
}
int mid=(L+R)>>1 ;
make_tree(L,mid,id*2) ;
make_tree(mid+1,R,id*2+1) ;
seg[id].min_num=Min(seg[id*2].min_num,seg[id*2+1].min_num) ;
}
int query(int L ,int R ,int id){
if(L<=seg[id].left&&seg[id].right<=R)
return  seg[id].min_num ;
int mid=(seg[id].left+seg[id].right)>>1  ;
if(R<=mid)
return query(L,R,id*2) ;
else if(mid<L)
return  query(L,R,id*2+1) ;
else
return Min(query(L,mid,id*2),query(mid+1,R,id*2+1)) ;
}
int main(){
int L ,R ;
while(scanf("%d",&N)!=EOF){
for(int i=1;i<=N;i++)
scanf("%d",&num[i]) ;
make_tree(1,N,1) ;
scanf("%d",&M) ;
while(M--){
scanf("%d%d",&L,&R)  ;
if(L>R)
swap(L,R) ;
printf("%d\n",query(L,R,1)) ;
}
}
return 0 ;
}


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