一、内容
给定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;
}