这道题目我们首先思考如何判断一个区间是否是可以满足条件的呢?
显然他需要满足条件
max
{
l
i
}
≤
r
i
\max\{l_i\}\leq r_i
max{li}≤ri
然后我们可以利用单调队列维护这一段区间的答案的情况
但是注意这时候计算的答案就不是
t
a
i
l
−
h
e
a
d
+
1
tail-head+1
tail−head+1了,而是从上一个被从队首
p
o
p
pop
pop出去的位置的
+
1
+1
+1到当前节点
这个时候就体现出来手写队列的优势了,答案就应该是
q
[
t
a
i
l
]
−
q
[
h
e
a
d
−
1
]
q[tail]-q[head-1]
q[tail]−q[head−1]
然后就没了
#include <bits/stdc++.h>
using namespace std;
# define Rep(i,a,b) for(int i=a;i<=b;i++)
# define _Rep(i,a,b) for(int i=a;i>=b;i--)
# define RepG(i,u) for(int i=head[u];~i;i=e[i].next)
typedef long long ll;
const int N=1e6+5;
template<typename T> void read(T &x){
x=0;int f=1;
char c=getchar();
for(;!isdigit(c);c=getchar())if(c=='-')f=-1;
for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+c-'0';
x*=f;
}
int n,ans;
int l[N],r[N];
int q[N],head,tail;
int main()
{
read(n);
Rep(i,1,n)read(l[i]),read(r[i]);
head=1,tail=0;
Rep(i,1,n){
while(head<=tail&&l[q[tail]]<l[i])tail--;
while(head<=tail&&l[q[head]]>r[i])head++;
q[++tail]=i;
ans=max(ans,i-q[head-1]);
}
printf("%d\n",ans);
return 0;
}