一、内容

给定N个闭区间[ai,bi],请你将这些区间分成若干组,使得每组内部的区间两两之间(包括端点)没有交集,并使得组数尽可能小。
输出最小组数。

输入格式

第一行包含整数N,表示区间数。接下来N行,每行包含两个整数ai,bi,表示一个区间的两个端点。

输出格式

输出一个整数,表示最小组数。

数据范围

1≤N≤105,
−109≤ai≤bi≤109

输入样例:

3
-1 1
2 4
3 5

输出样例:

2

二、思路

  • 我们判断一个区间是否能加入一个组,就与这个组的max_r(区间)进行比较,若大于它那么就可以添加到这个组。若不大于它那么就新开一个组
  • 我们用小根堆来维护已经开了的组的所有max_r,我们取最小的max_r,若这个组连最小的max_r都不大于,那么只能重开一个组。

三、代码

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
const int N = 1e5 + 5;
struct node {
	int l, r;
} nodes[N];
bool cmp(node a, node b){
	if (a.l == b.l) return a.r < b.r;
	return a.l < b.l;
}
int n, ans;
int main() {
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		scanf("%d%d", &nodes[i].l, &nodes[i].r);
	}
	sort(nodes, nodes + n, cmp);
	//我们每次选择右端点最小的组进行放区间 ,若无法放就新开一个组 
	priority_queue<int, vector<int>, greater<int> > q;
	for (int i = 0; i < n; i++) {
	 	if (q.empty() || q.top() >= nodes[i].l) {
	 		//重新开一个组
			q.push(nodes[i].r); 
		} else {
			q.pop();
			q.push(nodes[i].r); 
		}
	}
	printf("%d", q.size());
 	return 0; 
}