思路:
按照每个区间[a, b]中的a来从小到大排序。
第一次,计算开头落在 [0, 0] 之间的区间[a, b]中,b的最大值 b1。
第二次,计算开头落在 [0, b1 + 1] 之间的区间[a, b]中,b的最大值 b2。
第三次,计算开头落在 [b1 + 1, b2 + 1] 之间的区间 [a, b] 中,b的最大值 b3。
。。。
#include <stdio.h>
#include <stdlib.h>


struct node
{
int start, end;
};

struct node arr[25032];
int N, T;

int cmp(const void *a, const void *b)


{
return ((struct node *)a)->start - ((struct node *)b)->start;
}

int main()


{
int i, max_val, cnt, end;

freopen("e:\\test\\in.txt", "r", stdin);

scanf("%d%d", &N, &T);
for (i = 0; i < N; i++)
scanf("%d%d", &arr[i].start, &arr[i].end);
qsort(arr, N, sizeof(arr[0]), cmp);
i = cnt = 0;
end = 1;

while (end <= T)
{
max_val = 0;

while (i < N && arr[i].start <= end)
{
if (arr[i].end > max_val)
max_val = arr[i].end;
i++;
}
if (!max_val)
break;
end = max_val + 1;
cnt++;
}
printf("%d\n", end == T + 1 ? cnt : -1);
}
