zoukankan      html  css  js  c++  java
  • 51nod 1174 区间中最大的数

    基准时间限制:1 秒 空间限制:131072 KB 
    给出一个有N个数的序列,编号0 - N - 1。进行Q次查询,查询编号i至j的所有数中,最大的数是多少。
     
    例如: 1 7 6 3 1。i = 1, j = 3,对应的数为7 6 3,最大的数为7。(该问题也被称为RMQ问题)
    Input
    第1行:1个数N,表示序列的长度。(2 <= N <= 10000)
    第2 - N + 1行:每行1个数,对应序列中的元素。(0 <= S[i] <= 10^9)
    第N + 2行:1个数Q,表示查询的数量。(2 <= Q <= 10000)
    第N + 3 - N + Q + 2行:每行2个数,对应查询的起始编号i和结束编号j。(0 <= i <= j <= N - 1)
    Output
    共Q行,对应每一个查询区间的最大值。
    Input示例
    5
    1
    7
    6
    3
    1
    3
    0 1
    1 3
    3 4
    Output示例
    7
    7
    3
    ---------
    解:rmq问题;
    1.线段树(基础);
    2.st表;
    直接上代码:
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using std::min;
    using std::max;
    const int N=10017;
    int map[N];
    int f[N<<1][27],lg[N<<1];
    int sovle(int l,int r)
    {
        int t=lg[r-l+1];  
        return max(f[l][t],f[r-(1<<t)+1][t]);
    }
    int main()
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++) scanf("%d",&map[i]);
        lg[1]=0;  
        for(int i=2;i<=n;i++)      lg[i]=lg[i>>1]+1;   
        for(int i=1;i<=n;i++)  f[i][0]=map[i];  
          
        for(int j=1;j<=22;j++)  
        for(int i=1;i<=n-( 1<<(j -1) );i++)    
        f[i][j]=max(f[i][j-1],f[ i+( 1<< (j-1) )][ j-1 ]); 
        int m;
        scanf("%d",&m);
        int l,r;
        for(int i=1;i<=m;i++)
        {
            scanf("%d %d",&l,&r);
            printf("%d
    ",sovle(l+1,r+1));
        }
        return 0;
    }
    51nod 1174 st表

    用 st表rmq 可以求 lca,then 求 51nod 1766

    ============

  • 相关阅读:
    ubuntu下erlang man的安装
    ranch分析学习(四)
    ranch分析学习(三)
    ranch分析学习(二)
    ranch分析学习(一)
    IIS 配置错误解决方法集合
    Visual Studio 2013中添加mimeType
    wordpress 开发日志及技巧收集
    css3 动画
    高宽比例计算方法及等比高宽修改计算方法
  • 原文地址:https://www.cnblogs.com/12fs/p/7747102.html
Copyright © 2011-2022 走看看