维护一个L[i]单调不增的队列,且如果队首的L大于队尾的R就弹出。
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
int l[1000005],r[1000005],q[1000005];
int n,now,last=1,ans=1;
inline int read()
{
int a=0,f=1; char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();}
while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();}
return a*f;
}
int main()
{
n=read();
for (int i=1;i<=n;i++) l[i]=read(),r[i]=read();
int t=1,w=0;
for (int i=1;i<=n;i++)
{
while (t<=w&&l[q[w]]<=l[i]) w--;
q[++w]=i;
now=last;
while (l[q[t]]>r[i]) now=q[t++]+1;
ans=max(ans,i-now+1);
last=now;
}
cout << ans;
return 0;
}