【模板】 区间覆盖

传送门

题解

\(N\)个闭区间\([a_{i},b_{i}]\)以及一个线段区间\([s,t]\),请你选择尽量少的区间,将指定线段区间完全覆盖。
输出最少区间数,如果无法完全覆盖则输出\(-1\)

数据范围

\(\begin{array}{l}1 \leq N \leq 10^{5} \\ -10^{9} \leq a_{i} \leq b_{i} \leq 10^{9} \\ -10^{9} \leq s \leq t \leq 10^{9}\end{array}\)

题解

(1)按照左端点从小到大排序
(2)从前往后依次枚举每个区间,在所有能覆盖的start区间中选择右端点最大的区间,然后将start更新成右端点的最大值

Code

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<n;i++)
#define l first
#define r second 
typedef pair<int,int> pii;
const int N=1e5+10;
int n;

pii segs[N];
int main(){
    int st,ed;
    scanf("%d%d",&st,&ed);
    scanf("%d",&n);
    rep(i,0,n) scanf("%d%d",&segs[i].l,&segs[i].r);
    sort(segs,segs+n);

    bool ok=0;
    int ans=0;

    rep(i,0,n){
        int j=i,r=-2e9;
        while(j < n && segs[j].l <= st) r = max(r , segs[j].r),j++;

        if(r<st){
            ans=-1;
            break;
        }

        ans++;

        if(r >= ed){
            ok=1;
            break;
        }
        st = r;
        i = j - 1;
    }

    if(!ok) ans=-1;

    printf("%d\n",ans);
}
posted @ 2020-06-19 10:14  Hyx'  阅读(169)  评论(0)    收藏  举报