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;
    }
    
    
    
    
    


  • 相关阅读:
    解决ListView异步加载数据之后不能点击的问题
    android点击实现图片放大缩小 java技术博客
    关于 数据文件自增长 的一点理解
    RAC 实例不能启动 ORA1589 signalled during ALTER DATABASE OPEN
    Linux 超级用户的权利
    RAC 实例 迁移到 单实例 使用导出导入
    Shell 基本语法
    Linux 开机引导与关机过程
    RAC 实例不能启动 ORA1589 signalled during ALTER DATABASE OPEN
    Oracle RAC + Data Guard 环境搭建
  • 原文地址:https://www.cnblogs.com/riskyer/p/3357878.html
Copyright © 2011-2022 走看看