zoukankan      html  css  js  c++  java
  • 九度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;
    }
    
    
    
    
    


  • 相关阅读:
    C#获取局域网MAC地址
    查看Linux是32位还是64位的方法
    JS判断不能为空实例代码
    SQL2005数据库行列转换
    mysql 导入导出数据库、数据表的方法
    linux kill 关闭进程命令
    设置CentOS控制台分辨率图文详解
    Windows 2003 IIS 不支持ASP问题的解决方法
    稳聘App设计图分享
    Sql 中存储过程详细案例
  • 原文地址:https://www.cnblogs.com/riskyer/p/3357878.html
Copyright © 2011-2022 走看看