1. 这是一个线段性质的问题。注意如何从左边到右边,依次处理了基本的三个线段关系,以及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;
}