zoukankan      html  css  js  c++  java
  • ST表

    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    
    const int MAXN=1e6;
    
    inline int read()
    {
        char c=getchar();int x=0,f=1;
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    
    int Max[MAXN][21];
    
    int Query(int l,int r)
    {
        int k=log2(r-l+1);
        return max(Max[l][k],Max[r-(1<<k)+1][k]);
    }
    
    int main()
    {
    
        int N=read(),M=read();
    
        for(int i=1;i<=N;i++)
        Max[i][0]=read();
    
        for(int i=1;i<=21;i++)
            for(int j=1;j+(1<<i)-1<=N;j++)//(1<<i) j加2的i次方 
                Max[j][i]=max(Max[j][i-1],Max[j+(1<<(i-1))][i-1]);
                
            for(int i=1;i<=M;i++)
            {
                int l=read(),r=read();
                
                printf("%d
    ",Query(l,r));
                    
            }
    
        return 0;
        
    }

     这个题总感觉和Dp有辣么一点相似,首先Max[i][j]表示的是从i这个点到2的j次方这个点的这一段区间的最大值(或最小值),是不是有点Dp的感觉,对于静态查询的ST表,主要思路是把每个区间的最大或最小值提前预处理,在需要查询的时候,在相应区间内通过比较各个小区间的值来求出最终的答案。和二分的思想差不多,将大区间分为多个小区间,最终来更新答案。

    //该题解代码 来源于洛古题解

  • 相关阅读:
    poj 2516 Minimum Cost (最小费用流 )
    new start
    关于c语言中的声明和定义
    多态性与虚函数之对象切片
    C专家编程之typedef
    QGroupBox设置边框
    多态性与虚函数之继承中的virtual 晚捆绑
    使用Map
    遍历控件
    C专家编程之枚举
  • 原文地址:https://www.cnblogs.com/dairuizhe/p/13246246.html
Copyright © 2011-2022 走看看