题目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]内的最小值。
样例输入:
样例输出:
给定一个数字序列,查询任意给定区间内数字的最小值。
输入:
输入包含多组测试用例,每组测试用例的开头为一个整数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; }
相关文章推荐
- 九度oj 题目1544:数字序列区间最小值
- 题目1544:数字序列区间最小值
- 九度 1544 数字序列区间最小值(朴素线段树)
- [Jobdu] 题目1544:数字序列区间最小值
- 题目1544:数字序列区间最小值
- 九度OJ 1544 数字序列区间最小值
- 九度OJ 1544 数字序列区间最小值
- 九度OJ 1544 数字序列区间最小值
- 九度 1544 数字序列区间最小值
- 九度Oj 1544 数字序列区间最小值
- 题目1386:旋转数组的最小数字-九度
- 算法题目---和为s的两个数字vs和为s的连续正数序列
- 题目1386:旋转数组的最小数字
- 编程之美2015资格赛 题目2 : 回文字符序列 [ 区间dp ]
- 题目1386:旋转数组的最小数字
- 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,
- /*c语言,要求输入一个数字,统计其中偶数的个数,频率,最大最小等题目要求输入一个数字,然后统计其中的偶数的个数,最大的偶数和最小的偶数,以及最大偶数的发生频率*/
- 题目:区间最小数
- 【POJ 1651】【区间DP 矩阵链乘的变形】Multiplication Puzzle【一串数字,除了头尾不能动,每次取个数字,它与左右相邻数字的乘积为其价值,求价值和最小】
- 九度 题目1386:旋转数组的最小数字