时间限制:1秒 内存限制:128M
题目描述
给定N个闭区间[ai,bi]以及一个线段区间[s,t],请你选择尽量少的区间,将指定线段区间完全覆盖。
输出最少区间数,如果无法完全覆盖,则输出-1。
输入描述
第一行包含两个整数s和t,表示给定线段区间的两个端点。
第二行一个整数n,表示给定区间数。
接下来n行,每行两个整数ai,bi,表示一个区间的两个端点。
输出描述
输出一个整数,表示所需最少区间数。
如果无解,则输出-1。
数据范围
1<=N <= 1e5
-1e9 <= ai <= bi <= 1e9
-1e10<=s<=t<=1e9
输入样例
1 5
3
-1 3
2 4
3 5
输出样例
2
#include<cmath>
#include<cstdio>
#include<string>
#include<cstring>
#include<iomanip>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10;
const int M=0x3f3f3f3f;
struct node{
int st,en;
}a[N];
int s,t,n;
bool cmp(node x,node y){
return x.st <y.st;
}
int main(){
cin>>s>>t;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].st>>a[i].en;
}
sort(a+1,a+n+1,cmp);
int ans=0;
bool flag=0;
for(int i=1;i<=n;i++){
int j=i;
int k=-M;
while(j<=n&&a[j].st<=s){
k=max(a[j].en,k);
j++;
}
if(k<s){
ans=-1;
break;
}
ans++;
if(k>=t){
flag=1;
break;
}
s=k;
i=j-1;
}
if(!flag) ans=-1;
cout<<ans;
return 0;
}