- 这是一个线段性质的问题。注意如何从左边到右边,依次处理了基本的三个线段关系,以及i达到最后一个的时候怎么判断是否能覆盖。(很重要)
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
long L;
long xi,yi;
cin>>n>>L;
vector<pair<int,int>> v;
for(int i =0; i< n;i++){
cin>>xi>>yi;
v.push_back({xi,yi});
}
sort(v.begin(),v.end(),[](pair<long,long> a, pair<long,long> b){
if(a.first==b.first){
return a.second>b.second;
}else{
return a.first<b.first;
}
});
int pre = 0, last = 0, i =0, ans = 0;
while(i<v.size()){
while(i<v.size()&&v[i].first<=pre){//处理堆叠情况以及下一次的连续链接情况
last = max(last,v[i].second);//前面是处理最后一条
i++;
}
pre = last;//进行下一步是否有缺口判断
ans++;
if(i<v.size()&&v[i].first>pre){
ans==-1;
break;
}
if(last>=L){
break;//剪枝,只处理下面的
}
}
if(ans==-1||last<L){//前面如果执行完last还不够的话,证明还是不行
cout<<-1<<endl;
}else{
cout<<ans<<endl;
}
return 0;
}