• 平衡的阵容 st表学习


    模板

    预处理

    void rmq_isit()
    
    { 
        for(int i=1;i<=n;i++) 
            mx[i][0]=mn[i][0]=a[i]; 
        for(int j=1;(1<<j)<=n;j++)
            for(int i=1;i+(1<<j)-1<=n;i++)
                mx[i][j]=max(mx[i][j-1],mx[i+(1<<(j-1))][j-1]),
                mn[i][j]=min(mn[i][j-1],mn[i+(1<<(j-1))][j-1]);
    }

    区间查询

    int rmqcx(int l,int r)
    {
        int k=0;
        while(1<<k+1<=(r-l+1))k++;//1<<k+1保证找到的k是最后一个小于等于log2 r-l的元素而不是第一个大于它的元素
        int ans1=max(mx[l][k],mx[r-(1<<k)+1][k]);
        int ans2=min(mn[l][k],mn[r-(1<<k)+1][k]);
        return ans1-ans2;
    }

    例题

    [USACO07JAN]平衡的阵容Balanced Lineup

    #include<iostream>
    using namespace std;
    int n,q,a[50001];
    int mx[50001][18],mn[50001][18];
    void yuchuli()
    {
        for(int i=1;i<=n;i++)mx[i][0]=a[i],mn[i][0]=a[i];
        for(int i=1;(1<<i)<=n;i++)
            for(int j=1;j+(1<<i)-1<=n;j++)
            {
                mx[j][i]=max(mx[j][i-1],mx[j+(1<<(i-1))][i-1]);
                mn[j][i]=min(mn[j][i-1],mn[j+(1<<(i-1))][i-1]);
            }
    }
    int fangwen(int l,int r)
    {
        int k=0;
        while(1<<k+1<=r-l+1)k++;
        int Mx,Mn;
        Mx=max(mx[l][k],mx[r-(1<<k)+1][k]);
        Mn=min(mn[l][k],mn[r-(1<<k)+1][k]);
        return Mx-Mn;
    }
    int main()
    {
        cin>>n>>q;
        for(int i=1;i<=n;i++)cin>>a[i];
        yuchuli();
        int l,r;
        for(int i=1;i<=q;i++)
        {
            cin>>l>>r;
            cout<<fangwen(l,r)<<endl;
        }
    }
  • 相关阅读:
    旋转数组求最小值
    docker
    php爬虫
    docker,docker-compose 安装
    ReactPHP
    Workerman了解一下
    ubantu 运行.sh 脚本的问题
    ubantu 文件权限 Permission denied
    ubantu 文件属性
    mysql命令行中执行sql的几种方式总结
  • 原文地址:https://www.cnblogs.com/thmyl/p/7359375.html
Copyright © 2020-2023  润新知