给定 𝑁 个闭区间 [𝑎𝑖,𝑏𝑖] 以及一个线段区间 [𝑠,𝑡],请你选择尽量少的区间,将指定线段区间完全覆盖。
输出最少区间数,如果无法完全覆盖则输出 −1。
输入格式
第一行包含两个整数 𝑠 和 𝑡,表示给定线段区间的两个端点。
第二行包含整数 𝑁,表示给定区间数。
接下来 𝑁 行,每行包含两个整数 𝑎𝑖,𝑏𝑖,表示一个区间的两个端点。
输出格式
输出一个整数,表示所需最少区间数。
如果无解,则输出 −1。
数据范围
1≤𝑁≤,
−≤𝑎𝑖≤𝑏𝑖≤,
−≤𝑠≤𝑡≤
输入样例:
1 5
3
-1 3
2 4
3 5
输出样例:
2
代码:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 100010;
int n,Start,End,l,r;
vector<pair<int,int>> Interval;
int main(){
cin>>Start>>End;
cin>>n;
for(int i = 0;i < n;i ++){
cin>>l>>r;
Interval.push_back({l,r});
}
int flag = -1;
sort(Interval.begin(),Interval.end());
int res = 0;
for(int i = 0;i < n;i ++){
int j = i, MaxStartRight = -2e9;;
while(j < n && Interval[j].first <= Start){
MaxStartRight = max(MaxStartRight, Interval[j].second);
j ++;
}
if(MaxStartRight < Start){
break;
}
res ++;
if(MaxStartRight >= End){
flag = 1;
break;
}
i = j - 1;
Start = MaxStartRight;
}
if(flag == -1){
res = -1;
}
cout<<res<<endl;
return 0;
}