RT.
个人觉得完全没有必要用单调队列,不难分析出答案也是具有单调性的,换句话说插入的新元素肯定会顶替原来的老元素,那么直接用一个寄存的变量记录下来就可以了,完全没有必要用单调队列
比如这份代码就可以通过本题```cpp
#include <bits/stdc++.h>
using namespace std;
const int N=200005;
int n,m,minl[N],maxl[N],f[N],j=1,re;
bool opt=1;
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n+1;i++) minl[i]=i;
for(int i=1,l,r;i<=m;i++){
scanf("%d%d",&l,&r);
minl[r]=min(minl[r],l);
maxl[r+1]=max(maxl[r+1],l);
}
for(int i=n;i>=1;i--)minl[i]=min(minl[i],minl[i+1]);
for(int i=1;i<=n+1;i++)maxl[i]=max(maxl[i],maxl[i-1]);
for(int i=1;i<=n+1;i++){
for(;j<minl[i];j++)
if(f[j]!=-1){
opt=1;
re=j;
}
if(opt&&re<maxl[i])opt=0;
if(opt)f[i]=f[re]+(i!=n+1);
else f[i]=-1;
}
printf("%d",f[n+1]);
return 0;
}