zoukankan      html  css  js  c++  java
  • 【ST表】【模板】ST表

    Definition

         ST表是一种用于处理静态RMQ问题(无修改区间最值问题)的最快数据结构,书写方便使用简单效率便捷。其中其预处理复杂度为O(nlogn),查询复杂度为O(1)。总时间复杂度为O(nlogn)。常数远小于树状数组、线段树等毒瘤数据结构。

         事实上,ST表不能叫做ST。因为T本身就代表table= =

         ST表在预处理时采用倍增以及DP思想,即设f[i][j]为i向右2j-1个坐标的最大值。在DP时以j为阶段进行转移。

         在查询时,由于2的(被查询区间长度的对数的两倍)个单位(即22*log(len))一定大于区间长度,所以可以查询左右端点向中间2log(len)-1个单位的最大值,取max即为答案。

         由于ST表极为简单,在这里直接给出代码。

    Code

    #include<cmath>
    #include<cstdio>
    #define maxn 100010
    
    inline void qr(int &x) {
        char ch=getchar();int f=1;
        while(ch>'9'||ch<'0')    {
            if(ch=='-')    f=-1;
            ch=getchar();
        }
        while(ch>='0'&&ch<='9')    x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
        x*=f;
        return;
    }
    
    inline int max(const int &a,const int &b) {if(a>b) return a;else return b;}
    inline int min(const int &a,const int &b) {if(a<b) return a;else return b;}
    inline int abs(const int &x) {if(x>0) return x;else return -x;}
    
    inline void swap(int &a,int &b) {
        int c=a;a=b;b=c;return;
    }
    
    int n,m,frog[maxn][20],LOG[maxn],a,b;
    
    int main() {
        qr(n);qr(m);
        for(int i=1;i<=n;++i) {qr(frog[i][0]);LOG[i]=log2(i);}
        for(int j=1;j<=21;++j) {
            for(int i=1;i<=n;++i) {
                if(i+(1<<j)-1>n)    break;
                frog[i][j]=max(frog[i][j-1],frog[i+(1<<(j-1))][j-1]);
            }
        }
        while(m--) {
            a=b=0;qr(a);qr(b);int &t=LOG[b-a+1];
            printf("%d
    ",max(frog[a][t],frog[b-(1<<t)+1][t]));
        }
        return 0;
    }
  • 相关阅读:
    django表单字段
    python3之Django表单(一)
    python3之Django模型(一)
    python3迭代器和生成器
    python3数字、日期和时间
    python3字符串与文本处理
    python3数据结构与算法
    git仓库使用
    django邮件
    python3光学字符识别模块tesserocr与pytesseract
  • 原文地址:https://www.cnblogs.com/yifusuyi/p/9281250.html
Copyright © 2011-2022 走看看