分析
将所有区间按l从小到大排序,要用最少的区间数覆盖目标区间,每次合并时选择满足条件的最大值即可。
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10;
struct Range{
int l,r;
bool operator < (const Range &w)const{
return l<w.l;
}
}range[N];
int main(){
int st,ed,n;
cin>>st>>ed;
cin>>n;
for(int i=0;i<n;i++)cin>>range[i].l>>range[i].r;
sort(range,range+n);
int res=0;
bool success=false;
for(int i=0;i<n;i++){
int j=i,r=-2e9;
while(j<n&&range[j].l<=st){//找到所有包括st的最大r的区间
r=max(r,range[j].r);
j++;
}
if(r<st){//所有区间都<st,直接退出
res=-1;
break;
}
res++;
if(r>=ed){
success=true;
break;
}
st=r;
i=j-1;//由于前面range[j].l<=st,所以此时i要-1
}
if(!success)res=-1;
cout<<res<<endl;
return 0;
}