【模板】 区间覆盖
传送门
题解
\(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);
}

浙公网安备 33010602011771号