九度Oj 1544 数字序列区间最小值

题目1544:数字序列区间最小值

时间限制:1 秒

内存限制:128 兆

特殊判题:

提交:602

解决:112

题目描述:

给定一个数字序列,查询任意给定区间内数字的最小值。

输入:

输入包含多组测试用例,每组测试用例的开头为一个整数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
这道题因为vector没有清空导致错误!!!
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<math.h>
#include<vector>
using namespace std;
vector<int> A;
int min(int a,int b)
{
    return a<b?a:b;
}
 
int d[100202][30];
void rmqinit()
{
    int n=A.size();
    int i;
    memset(d,1,sizeof(d));
    for(i=0;i<n;i++)
        d[i][0]=A[i];
    for(int j=1;(1<<j)<=n;j++)
        for(i=0;i+(1<<j)-1<n;i++)
        {
            d[i][j]=min(d[i][j-1],d[i+(1<<j-1)][j-1]);
        }
}
int rmq(int L,int R)
{
    int k=0;
    while(1<<(k+1)<=R-L+1) k++;
    return min(d[L][k],d[R-(1<<k)+1][k]);
}
int main()
{
    int num,temp,L,R,T;
    while(scanf("%d",&num)!=EOF)
    {
         
        for(int i=0;i<num;i++)
        {
            scanf("%d",&temp);
            A.push_back(temp);
            //  printf("%d
",A[i]);
        }
         
         
        cin>>T;
        rmqinit();
        while(T--)
        {
            scanf("%d%d",&L,&R);
             
            printf("%d
",rmq(L-1,R-1));
        }
		A.clear();
    }
    return 0;
}
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<math.h>
#include<vector>
using namespace std;
//vector<int> 
int A[100006];
int min(int a,int b)
{
	return a<b?a:b;
}

int num,d[100202][300];
void rmqinit()
{
	int n=num;
	int i;
	memset(d,1,sizeof(d));
	for(i=0;i<n;i++)
		d[i][0]=A[i];
	for(int j=1;(1<<j)<=n;j++)
		for(i=0;i+(1<<j)-1<n;i++)
		{
			d[i][j]=min(d[i][j-1],d[i+(1<<j-1)][j-1]);
		}
}
int rmq(int L,int R)
{
	int k=0;
	while(1<<(k+1)<=R-L+1) k++;
	return min(d[L][k],d[R-(1<<k)+1][k]);
}
int main()
{
	int L,R,T;
	while(scanf("%d",&num)!=EOF)
	{
		
		for(int i=0;i<num;i++)
		{
			scanf("%d",&A[i]);
			//A.push_back(temp);
			//	printf("%d
",A[i]);
		}
		
		
		cin>>T;
		rmqinit();
		while(T--)
		{
			scanf("%d%d",&L,&R);
			
			printf("%d
",rmq(L-1,R-1));
		}
	}
	return 0;
}






原文地址:https://www.cnblogs.com/riskyer/p/3357878.html