zoukankan      html  css  js  c++  java
  • 题目1544:数字序列区间最小值

    题目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
    ",query(L,R,1)) ;
            }
       }
       return 0 ;
    }
    

      

  • 相关阅读:
    变量的含义,内存管理机制,数据类型的含义
    操作系统、应用程序的含义,编程语言的优缺点
    Pycharm常用快捷键
    计算机组成及原理
    仿酷狗音乐播放器开发日志——整体框架分析
    仿酷狗音乐播放器开发日志——整体框架分析
    c++与java的优缺点
    c++与java的优缺点
    unicode ansi utf-8 unicode_big_endian编码的区别
    unicode ansi utf-8 unicode_big_endian编码的区别
  • 原文地址:https://www.cnblogs.com/liyangtianmen/p/3354982.html
Copyright © 2011-2022 走看看