背景:
傻逼没想出来。
题目传送门:
https://www.luogu.org/problemnew/show/P3522
题意:
给若干个区间,在每个区间内都可以取一个值,求最长不下降子串的长度。
思路:
考虑一个区间,若合法,那么序列中最小的
l
l
l一定会小于等于最后的
r
r
r。
维护一个
l
l
l单调递减(让后面尽可能多的满足
r
r
r大于等于
l
l
l,使得结果尽可能大)且最小的
l
l
l小于等于最后的
r
r
r的序列即可。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,ans=0;
int l[1000010],r[1000010],que[1000010];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d %d",&l[i],&r[i]);
int head=1,tail=1;
que[1]=1;
for(int i=2;i<=n;i++)
{
while(head<=tail&&l[que[head]]>r[i]) head++;
ans=max(ans,i-que[head-1]);
while(head<=tail&&l[que[tail]]<=l[i]) tail--;
que[++tail]=i;
}
printf("%d",ans);
}