3939 - 上帝造题五分钟
问题描述
第一分钟,上帝说:要有题。于是就有了L,Y,M,C
第二分钟,LYC说:要有向量。于是就有了长度为n写满随机整数的向量
第三分钟,YUHCH说:要有查询。于是就有了Q个查询,查询向量的一段区间内元素的最小值
第四分钟,MZC说:要有限。于是就有了数据范围
第五分钟,CS说:要有做题的。说完众神一哄而散,留你来收拾此题
Input
第一行两个正整数n和Q,表示向量长度和查询个数
接下来一行n个整数,依次对应向量中元素:a[0],a[1],…,a[n-1]
接下来Q行,每行两个正整数lo,hi,表示查询区间[lo, hi]中的最小值,即min(a[lo],a[lo+1],…,a[hi])。
Output
共Q行,依次对应每个查询的结果,即向量在对应查询区间中的最小值。
Examples
Input
7 4 1 -1 -4 8 1 2 -7 0 0 1 3 4 5 0 6
Output
1 -4 1 -7
Hint
样例说明
第一个查询[0,0]表示求min{a[0]}=min{1}=1
第二个查询[1,3]表示求min{a[1],a[2],a[3]}=min{-1,-4,8}=-4
第三个查询[4,5]表示求min{a[4],a[5]}=min{1,2}=1
第四个查询[0,6]表示查询整个向量,求min{a[0..6]}=min{1,-1,-4,8,1,2,-7}=-7
数据规模和约定
1<=n<=1984,1<=Q<=1988,向量中随机整数的绝对值不超过1,000
Solution C
#include<stdio.h> int main() { int n,Q; scanf("%d%d",&n,&Q); int a[n]; int b[Q]; int i,j,k,l,p; for(i=0;i<n;i++) scanf("%d",&a[i]); while(Q--) { scanf("%d%d",&k,&l); for(i=k;i<l;i++) for(j=k+1;j<=l;j++) { if(a[i]>a[j]) { p=a[i]; a[i]=a[j]; a[j]=p; } } printf("%d\n",a[k]); } return 0; }
Solution C++
#include <iostream> using namespace std; typedef struct { int start; int end; int result; }stQuery; int findMin(int start, int end, int datas[1984]) { int i = start, min = datas[start]; while (i <= end) { if (min > datas[i]) { min = datas[i]; } i++; } return min; } int main() { int i = 0, dataNum, queryNum; int datas[1984]; stQuery querys[1988] = { 0 }; cin >> dataNum >> queryNum; while (i < dataNum) { cin >> datas[i]; i++; } i = 0; while (i < queryNum) { cin >> querys[i].start >> querys[i].end; querys[i].result = findMin(querys[i].start, querys[i].end, datas); i++; } i = 0; while (i < queryNum) { cout << querys[i].result << endl; i++; } return 0; }
Hint
样例说明
第一个查询[0,0]表示求min{a[0]}=min{1}=1
第二个查询[1,3]表示求min{a[1],a[2],a[3]}=min{-1,-4,8}=-4
第三个查询[4,5]表示求min{a[4],a[5]}=min{1,2}=1
第四个查询[0,6]表示查询整个向量,求min{a[0..6]}=min{1,-1,-4,8,1,2,-7}=-7
数据规模和约定
1<=n<=1984,1<=Q<=1988,向量中随机整数的绝对值不超过1,000