P2880 [USACO07JAN]平衡的阵容Balanced Lineup (st表入门)

题目链接

这个是st表的入门题。

附上st表的学习链接 AC龙 。这个博客讲的挺好的。

st表的建表时间复杂度是nlogn,查询时o(1),可用于处理RMQ问题,区间覆盖对问题不会造成影响的问题。

贴上代码,模板来自上面说的学习链接

Log【i】是指2^k <= i,k能取到的最大值,st【i】【j】代表从i位置向后长度为 2^j 这个区间中的最小值。

#include <bits/stdc++.h>
 
using namespace std;
int n;
const int maxn = 1e5+100;
int stMin[maxn][25],a[maxn],stMax[maxn][25];
void init()
{
    for(int i=1;i<=n;i++)stMax[i][0] = stMin[i][0] = a[i];
    for(int j = 1; (1<<j)<=n;j++)
        for(int i=1;(i+(1<<(j-1)))<=n;i++) 
        {
            stMax[i][j] = max(stMax[i][j-1],stMax[i+(1<<(j-1))][j-1]);
            stMin[i][j] = min(stMin[i][j-1],stMin[i+(1<<(j-1))][j-1]);
        }
}
void solve(int l,int r)
{
    int k = log(r-l+1)/log(2);
    int ansMin = min(stMin[l][k],stMin[r-(1<<k)+1][k]);
    int ansMax = max(stMax[l][k],stMax[r-(1<<k)+1][k]);
    cout<<ansMax-ansMin<<'\n';
}
int main()
{
    int m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)scanf("%d",a+i);
    init();
    while(m--)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        solve(u,v);
    }
    return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值