区间最值
Time Limit(Common/Java) :
1000 MS/ 3000 MS Memory Limit : 65536 KByte
Total Submit : 1151 Accepted : 268
Total Submit : 1151 Accepted : 268
Description
给定一个长度不超过10000的整数序列,对这个序列有不超过500000个询问,每次询问给定区间之内的最小值.
Input
第一行一个整数N(N<=10000)
第二行N个整数
第三行一个整数Q
以下共Q行,每行两个整数i,j用空格隔开,询问第i号元素到第j号元素之间的最小值
Output
每个询问输出一行,包含一个整数,为询问区间内的最小值
Sample Input
5
1 2 3 4 5
2
1 5
3 4
Sample Output
1
3
Source
NUAA
看到题目第一反应是二分,但仔细想想有点不对劲,因为二分查找是针对于有序数组的,这题显然是无序的,所以要么很难要么很水【手动笑哭脸】,显然这题不难,只要弄个结构体记录一下序号,然后把数组从小到大排个序,最后就可以从前往后依次比对一下看哪个数的序号最先落在所求区间内,所找的这个数就是答案。
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
struct data
{
int ord;
int val;
} num[10005];
bool cmp(data d1,data d2)
{
return d1.val<d2.val;
}
int main()
{
int N;
scanf("%d",&N);
for(int i=0; i<N; i++)
{
scanf("%d",&num[i].val);
num[i].ord=i;
}
sort(num,num+N,cmp);
int Q;
scanf("%d",&Q);
int s,e;
while(Q--)
{
scanf("%d%d",&s,&e);
for(int i=0;i<N;i++)
{
if(num[i].ord>=(s-1)&&num[i].ord<=(e-1))
{
printf("%d\n",num[i].val);
break;
}
}
}
}