zoukankan      html  css  js  c++  java
  • 平衡的阵容 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;
        }
    }
  • 相关阅读:
    程序集冲突问题
    Linux 菜鸟学习笔记--系统分区
    gawk
    Ansible
    Linux 网关及路由
    Linux档案与目录管理
    find命令
    sed详解
    FTP服务
    Gentoo安装(虚拟机)
  • 原文地址:https://www.cnblogs.com/thmyl/p/6066197.html
Copyright © 2011-2022 走看看