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