给定 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>
using namespace std;
const int N = 100010;
struct Range {
int l, r;
bool operator< (const Range& w)const {
return l < w.l;
}
};
Range range[N];
int main() {
int s, t;
cin >> s >> t;
int n;
cin >> n;
bool can = false;
for (int i = 0; i < n; i++) {
int l, r;
cin >> l >> r;
range[i] = { l,r };
}
sort(range, range + n);
int res = 0;
for (int i = 0; i < n; i++) {
int j = i,r=-2e9;
while (j < n && range[j].l <= s) {
//当满足当前选中区间点能够覆盖开头的时候
//j++;
r = max(r, range[j].r);
j++;//要在先取完点后再++
//继续往后查找 找到能满足覆盖区间的最大右端点
}
if (r < s) {
res = -1;
break;
}
res++;
if (r >= t) {
can = true;
break;
}
s = r;
i = j - 1;
}
if (can)cout << res << endl;
else cout << -1;
return 0;
}