1747:奶牛排队

【题目描述】

奶牛排成了一条直队。

显然,不同的奶牛身高不一定相同。

现在,奶牛们想知道,如果找出一些连续的奶牛,要求最左边的奶牛A是最矮的,最右边的B是最高的,且B高于A,且中间如果存在奶牛,则身高不能和A、B奶牛相同,问这样的一些奶牛最多会有多少头。

从左到右给出奶牛的身高,请告诉它们符合条件的最多的奶牛数(答案可能是0、2,但不会是1)。

【输入】

第一行一个数N(2≤N≤100000),表示奶牛的头数。

接下来N个数,每行一个数,从上到下表示从左到右奶牛的身高(1≤身高≤264−1)。

【输出】

一行,表示最多奶牛数。

【输入样例】

5
1
2
3
4
1

【输出样例】

4
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
int n,m;
int dp[maxn][25][2],a[maxn];
void rmq_init()
{
    for(int i=1;i<=n;i++)
        dp[i][0][0]=dp[i][0][1]=a[i];//初始化
    for(int j=1;(1<<j)<=n;j++)
        for(int i=1;i+(1<<j)-1<=n;i++)
            dp[i][j][0]=max(dp[i][j-1][0],dp[i+(1<<j-1)][j-1][0]),
            dp[i][j][1]=min(dp[i][j-1][1],dp[i+(1<<j-1)][j-1][1]);
    return;
}
int rmq(int l,int r){
    int k=log2(r-l+1);
    return max(dp[l][k][0],dp[r-(1<<k)+1][k][0]);
}
int find(int l,int r){
    int k=log2(r-l+1);
    return min(dp[l][k][1],dp[r-(1<<k)+1][k][1]);
}
int main()
{
    int x,y;
    scanf("%d %d",&n,&m);
    for( int i=1; i<=n; i++ ) scanf("%d",&a[i]);
    rmq_init();
    while(m--){
        scanf("%d %d",&x,&y);
        printf("%d\n",rmq(x,y)-find(x,y));
    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值