【单调队列】 贪心 序列

【问题描述】
作为一名火星人,你为了占领地球,需要想方设法使地球人失去信心。现在你获得了一项能力,控制今后n天的天气温度,对于第i天,你能将温度控制在[ai,bi]中任意一个数字,你的目的是使其中某段时间,温度持续不下降,趁此来攻击地球。现在问你最多可以使连续的多少天满足温度不下降。

【问题分析】

贪心显然不对 hack数据乱搞

4
2 3 1 4 1 1 1 1

贪心part

如果说有一个区间都满足要求,显然取最左。

所以说要对于每一个l进行考虑,显然对于递增的l,r也是递增的。
所以只要在之前的基础上考虑再接几段区间即可。在验证新区间是否加进来的时候需要知道max(a[i]) l<=i<=r,所以要用一个单调队列进行维护递增区间。

#include <iostream>
#include <cstdio>
using namespace std;
const int N=1000001;
int n,ans; int a[N],b[N],q[N];
int readin()
{
    int x=0,f=1; char ch=getchar();
    while(ch>'9'||ch<'0') {if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
int mymax(int a,int b)
{return a>b?a:b;}
void read()
{
    int i;
    n=readin();
    for (i=1;i<=n;i++)
        a[i]=readin(),b[i]=readin();
    q[1]=1;
    return;
}
void work()
{
    int i,p=2,head=1,tail=1;
    //  i==l p==r
    for (i=1;i<=n&&p<=n;i++)
    {
        //大于i的最大值
        while(head<=tail&&q[head]<i) head++;
        if (p<=i) p=i+1,q[++tail]=i;
        //维护单调区间
        while(p<=n&&b[p]>=a[q[head]])
        {
            while(head<=tail&&a[q[tail]]<a[p]) tail--;
            q[++tail]=p++;
        }
        ans=mymax(ans,p-i);
    }
    printf("%d\n",ans);
    return;
}
int main()
{
    freopen("sequence.in","r",stdin);
    freopen("sequence.out","w",stdout);
    read();
    work();
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值