区间覆盖

给定 N 个闭区间 [ai,bi]以及一个线段区间 [s,t],请你选择尽量少的区间,将指定线段区间完全覆盖。

输出最少区间数,如果无法完全覆盖则输出 −1。

输入格式

第一行包含两个整数 s 和 t,表示给定线段区间的两个端点。

第二行包含整数 N,表示给定区间数。

接下来 N 行,每行包含两个整数 ai,bi,表示一个区间的两个端点。

输出格式

输出一个整数,表示所需最少区间数。

如果无解,则输出 −1。

数据范围

1≤N≤1e5
−1e9≤ai≤bi≤1e9
−1e9≤s≤t≤1e9

输入样例:

1 5
3
-1 3
2 4
3 5

输出样例:

2

#include <iostream>
#include <algorithm>
#include <queue>

using namespace std;

const int N = 100010;
typedef pair<int, int>PII;
int a[N];
int n,res;
struct Range
{
    int l, r;
    bool operator< (const Range &W)const
    {
        return l < W.l;
    }
}range[N];

int main()
{
    int st,ed;
    cin>>st>>ed;
    scanf("%d", &n);
    for (int i = 0; i < n; i ++ )
    {
        int l, r;
        scanf("%d%d", &l, &r);
        range[i] = {l, r};
    }

    sort(range, range + n);
    bool s=false;
    for(int i=0;i<n;++i)
    {
        int j=i;
        int r=-2e9;
        while(j<n&&range[j].l<=st)
        {
            r=max(r,range[j].r);
            ++j;
        }
        if(r<st)
        {
            //s=false;
            break;
        }
        res++;
        if(r>=ed)
        {
            s=true;
            break;
        }
        st=r;
        i=j-1;
    }
    if(s) cout<<res<<endl;
    else cout<<"-1"<<endl;
    return 0;
}