分析都在代码注释里
#include<stdio.h>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn=25009;
struct Node{
int a;
int b;
}a[maxn];
//将结构体按照开始时间升序排列,
//如果开始时间一致,则按照结束时间降序排列。
bool cmp(const Node& i,const Node& j){
return i.a<=j.a?i.a==j.a?i.b>j.b:i.a<j.a:false;
}
int main(){
int n,t;
while(scanf("%d%d",&n,&t)!=EOF){
for(int i=0;i<n;i++)
scanf("%d%d",&a[i].a,&a[i].b);
sort(a,a+n,cmp);
int result=1;
int i=0,j=1;
int maxi=0;//用来存每次结束时间最大的下标。
if(a[0].a>1)
result=-1;
else{
while(1){
int max1=0;//用来判断是否存在满足条件的值。
//条件为:满足该牛开始时间小于等于上一只劳动的牛的结束时间
//或者比上一只牛结束时间大一。
if(a[maxi].b==t)
break;
while(i<n&&j<n&&(a[i].b>=a[j].a||a[j].a-a[i].b==1)){
if(a[j].b>max1){
maxi=j;
max1=a[j].b;
}
j++;
}
if(max1!=0){
result++;
i=maxi;
j=maxi+1;
}
if(max1==0){
result=-1;
break;
}
}
}
printf("%d\n",result);
}
return 0;
}