流水依依

希望朋友们有个好的身体,开开心心工作与学习。

博客园 首页 新随笔 联系 订阅 管理

题目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 ;
}

  

posted on 2013-10-07 09:36  流水依依  阅读(382)  评论(0编辑  收藏  举报