【问题描述】
作为一名火星人,你为了占领地球,需要想方设法使地球人失去信心。现在你获得了一项能力,控制今后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;
}